Skip to content

Commit

Permalink
samples/bpf: Fix to xdpsock to avoid recycling frames
Browse files Browse the repository at this point in the history
[ Upstream commit b69e56c ]

The txpush program in the xdpsock sample application is supposed
to send out all packets in the umem in a round-robin fashion.
The problem is that it only cycled through the first BATCH_SIZE
worth of packets. Fixed this so that it cycles through all buffers
in the umem as intended.

Fixes: 248c7f9 ("samples/bpf: convert xdpsock to use libbpf for AF_XDP access")
Signed-off-by: Weqaar Janjua <weqaar.a.janjua@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Björn Töpel <bjorn.topel@intel.com>
Link: https://lore.kernel.org/bpf/20200828161717.42705-1-weqaar.a.janjua@intel.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
weqaar authored and gregkh committed Oct 29, 2020
1 parent 88b34c0 commit 91c8e9e
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions samples/bpf/xdpsock_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -921,7 +921,7 @@ static void rx_drop_all(void)
}
}

static void tx_only(struct xsk_socket_info *xsk, u32 frame_nb, int batch_size)
static void tx_only(struct xsk_socket_info *xsk, u32 *frame_nb, int batch_size)
{
u32 idx;
unsigned int i;
Expand All @@ -934,14 +934,14 @@ static void tx_only(struct xsk_socket_info *xsk, u32 frame_nb, int batch_size)
for (i = 0; i < batch_size; i++) {
struct xdp_desc *tx_desc = xsk_ring_prod__tx_desc(&xsk->tx,
idx + i);
tx_desc->addr = (frame_nb + i) << XSK_UMEM__DEFAULT_FRAME_SHIFT;
tx_desc->addr = (*frame_nb + i) << XSK_UMEM__DEFAULT_FRAME_SHIFT;
tx_desc->len = PKT_SIZE;
}

xsk_ring_prod__submit(&xsk->tx, batch_size);
xsk->outstanding_tx += batch_size;
frame_nb += batch_size;
frame_nb %= NUM_FRAMES;
*frame_nb += batch_size;
*frame_nb %= NUM_FRAMES;
complete_tx_only(xsk, batch_size);
}

Expand Down Expand Up @@ -997,7 +997,7 @@ static void tx_only_all(void)
}

for (i = 0; i < num_socks; i++)
tx_only(xsks[i], frame_nb[i], batch_size);
tx_only(xsks[i], &frame_nb[i], batch_size);

pkt_cnt += batch_size;

Expand Down

0 comments on commit 91c8e9e

Please sign in to comment.