Message ID | 20201210153645.21286-1-magnus.karlsson@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | [bpf-next] samples/bpf: fix possible hang in xdpsock with multiple threads | expand |
On 12/10/20 4:36 PM, Magnus Karlsson wrote: > From: Magnus Karlsson <magnus.karlsson@intel.com> > > Fix a possible hang in xdpsock that can occur when using multiple > threads. In this case, one or more of the threads might get stuck in > the while-loop in tx_only after the user has signaled the main thread > to stop execution. In this case, no more Tx packets will be sent, so a > thread might get stuck in the aforementioned while-loop. Fix this by > introducing a test inside the while-loop to check if the benchmark has > been terminated. If so, exit the loop. > > Fixes: cd9e72b6f210 ("samples/bpf: xdpsock: Add option to specify batch size") > Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> With the patch applied, I'm getting a new warning: CC /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_user.o /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_user.c: In function ‘main’: /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_user.c:1272:6: warning: ‘idx’ may be used uninitialized in this function [-Wmaybe-uninitialized] 1272 | u32 idx; | ^~~ Previously compiling w/o issues: [...] CC /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_ctrl_proc.o CC /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_user.o CC /home/darkstar/trees/bpf-next/samples/bpf/xsk_fwd.o LD /home/darkstar/trees/bpf-next/samples/bpf/fds_example [...] For testing, I used: gcc --version gcc (GCC) 9.0.1 20190312 (Red Hat 9.0.1-0.10) Ptal, thx!
On Thu, Dec 10, 2020 at 5:03 PM Daniel Borkmann <daniel@iogearbox.net> wrote: > > On 12/10/20 4:36 PM, Magnus Karlsson wrote: > > From: Magnus Karlsson <magnus.karlsson@intel.com> > > > > Fix a possible hang in xdpsock that can occur when using multiple > > threads. In this case, one or more of the threads might get stuck in > > the while-loop in tx_only after the user has signaled the main thread > > to stop execution. In this case, no more Tx packets will be sent, so a > > thread might get stuck in the aforementioned while-loop. Fix this by > > introducing a test inside the while-loop to check if the benchmark has > > been terminated. If so, exit the loop. > > > > Fixes: cd9e72b6f210 ("samples/bpf: xdpsock: Add option to specify batch size") > > Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> > > With the patch applied, I'm getting a new warning: > > CC /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_user.o > /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_user.c: In function ‘main’: > /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_user.c:1272:6: warning: ‘idx’ may be used uninitialized in this function [-Wmaybe-uninitialized] > 1272 | u32 idx; > | ^~~ Sorry, I get it too. It was just masked with the other warnings I get these days when compiling the bpf samples. Regardless, it is the compiler trying to tell me I have done something stupid :-(. It should really be a return instead of a break, sigh. Will send a v2. > Previously compiling w/o issues: > > [...] > CC /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_ctrl_proc.o > CC /home/darkstar/trees/bpf-next/samples/bpf/xdpsock_user.o > CC /home/darkstar/trees/bpf-next/samples/bpf/xsk_fwd.o > LD /home/darkstar/trees/bpf-next/samples/bpf/fds_example > [...] > > For testing, I used: > > gcc --version > gcc (GCC) 9.0.1 20190312 (Red Hat 9.0.1-0.10) > > Ptal, thx!
diff --git a/samples/bpf/xdpsock_user.c b/samples/bpf/xdpsock_user.c index 568f9815bb1b..813f7eaabf82 100644 --- a/samples/bpf/xdpsock_user.c +++ b/samples/bpf/xdpsock_user.c @@ -1275,6 +1275,8 @@ static void tx_only(struct xsk_socket_info *xsk, u32 *frame_nb, int batch_size) while (xsk_ring_prod__reserve(&xsk->tx, batch_size, &idx) < batch_size) { complete_tx_only(xsk, batch_size); + if (benchmark_done) + break; } for (i = 0; i < batch_size; i++) {