Commit 872a1184 authored by Magnus Karlsson's avatar Magnus Karlsson Committed by Daniel Borkmann

selftests: xsk: Put the same buffer only once in the fill ring

Fix a problem where the fill ring was populated with too many
entries. If number of buffers in the umem was smaller than the fill
ring size, the code used to loop over from the beginning of the umem
and start putting the same buffers in again. This is racy indeed as a
later packet can be received overwriting an earlier one before the Rx
thread manages to validate it.
Signed-off-by: default avatarMagnus Karlsson <magnus.karlsson@intel.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20210922075613.12186-9-magnus.karlsson@gmail.com
parent 5b132056
...@@ -977,13 +977,18 @@ static void *worker_testapp_validate_tx(void *arg) ...@@ -977,13 +977,18 @@ static void *worker_testapp_validate_tx(void *arg)
static void xsk_populate_fill_ring(struct xsk_umem_info *umem, struct pkt_stream *pkt_stream) static void xsk_populate_fill_ring(struct xsk_umem_info *umem, struct pkt_stream *pkt_stream)
{ {
u32 idx = 0, i; u32 idx = 0, i, buffers_to_fill;
int ret; int ret;
ret = xsk_ring_prod__reserve(&umem->fq, XSK_RING_PROD__DEFAULT_NUM_DESCS, &idx); if (umem->num_frames < XSK_RING_PROD__DEFAULT_NUM_DESCS)
if (ret != XSK_RING_PROD__DEFAULT_NUM_DESCS) buffers_to_fill = umem->num_frames;
else
buffers_to_fill = XSK_RING_PROD__DEFAULT_NUM_DESCS;
ret = xsk_ring_prod__reserve(&umem->fq, buffers_to_fill, &idx);
if (ret != buffers_to_fill)
exit_with_error(ENOSPC); exit_with_error(ENOSPC);
for (i = 0; i < XSK_RING_PROD__DEFAULT_NUM_DESCS; i++) { for (i = 0; i < buffers_to_fill; i++) {
u64 addr; u64 addr;
if (pkt_stream->use_addr_for_fill) { if (pkt_stream->use_addr_for_fill) {
...@@ -993,12 +998,12 @@ static void xsk_populate_fill_ring(struct xsk_umem_info *umem, struct pkt_stream ...@@ -993,12 +998,12 @@ static void xsk_populate_fill_ring(struct xsk_umem_info *umem, struct pkt_stream
break; break;
addr = pkt->addr; addr = pkt->addr;
} else { } else {
addr = (i % umem->num_frames) * umem->frame_size + DEFAULT_OFFSET; addr = i * umem->frame_size + DEFAULT_OFFSET;
} }
*xsk_ring_prod__fill_addr(&umem->fq, idx++) = addr; *xsk_ring_prod__fill_addr(&umem->fq, idx++) = addr;
} }
xsk_ring_prod__submit(&umem->fq, XSK_RING_PROD__DEFAULT_NUM_DESCS); xsk_ring_prod__submit(&umem->fq, buffers_to_fill);
} }
static void *worker_testapp_validate_rx(void *arg) static void *worker_testapp_validate_rx(void *arg)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment