* (no subject) @ 2026-06-20 12:13 Siddharth C 2026-06-20 12:13 ` [PATCH 1/2] bpf: preserve rx_queue_index across XDP redirects Siddharth C 2026-06-20 12:13 ` [PATCH 2/2] selftests/bpf: validate rx_queue_index in xdp_metadata Siddharth C 0 siblings, 2 replies; 6+ messages in thread From: Siddharth C @ 2026-06-20 12:13 UTC (permalink / raw) To: ast, kuba, hawk, andrii, netdev, bpf, linux-kernel, linux-kselftest Cc: Siddharth C Subject: [PATCH 0/2] bpf: preserve rx_queue_index across XDP redirects XDP programs executed after redirect through cpumap and devmap currently lose ingress RX queue information because rx_queue_index is not preserved across xdp_buff to xdp_frame conversion. Preserve rx_queue_index in struct xdp_frame and restore it when rebuilding xdp_rxq_info for redirected execution paths. Add a selftest validating that ctx->rx_queue_index remains available through redirected execution. Testing: * Built modified kernel objects * Ran tools/testing/selftests/bpf/test_progs -t xdp_metadata -v * Verified xdp_metadata passes * Added explicit rx_queue_index assertion Siddharth C (1): bpf: preserve rx_queue_index across XDP redirects Siddharth_Cibi (1): selftests/bpf: validate rx_queue_index in xdp_metadata include/net/xdp.h | 2 ++ kernel/bpf/cpumap.c | 2 +- kernel/bpf/devmap.c | 5 ++++- net/core/xdp.c | 1 + tools/testing/selftests/bpf/prog_tests/xdp_metadata.c | 3 ++- tools/testing/selftests/bpf/progs/xdp_metadata.c | 2 +- tools/testing/selftests/bpf/xdp_metadata.h | 1 + 7 files changed, 12 insertions(+), 4 deletions(-) -- 2.53.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] bpf: preserve rx_queue_index across XDP redirects 2026-06-20 12:13 Siddharth C @ 2026-06-20 12:13 ` Siddharth C 2026-06-25 1:54 ` Jakub Kicinski 2026-06-20 12:13 ` [PATCH 2/2] selftests/bpf: validate rx_queue_index in xdp_metadata Siddharth C 1 sibling, 1 reply; 6+ messages in thread From: Siddharth C @ 2026-06-20 12:13 UTC (permalink / raw) To: ast, kuba, hawk, andrii, netdev, bpf, linux-kernel, linux-kselftest Cc: Siddharth C Store rx_queue_index in struct xdp_frame during xdp_buff to xdp_frame conversion and restore it when rebuilding xdp_rxq_info for cpumap and devmap execution paths. This preserves ingress RX queue information for XDP programs executed after redirect, allowing access to the original rx_queue_index instead of losing queue context. Also propagate rx_queue_index for zero-copy XDP frame conversion. Signed-off-by: Siddharth_Cibi <siddharthcibi@icloud.com> --- include/net/xdp.h | 2 ++ kernel/bpf/cpumap.c | 2 +- kernel/bpf/devmap.c | 5 ++++- net/core/xdp.c | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/net/xdp.h b/include/net/xdp.h index aa742f413c35..90318b2b76dc 100644 --- a/include/net/xdp.h +++ b/include/net/xdp.h @@ -301,6 +301,7 @@ struct xdp_frame { */ enum xdp_mem_type mem_type:32; struct net_device *dev_rx; /* used by cpumap */ + u32 rx_queue_index; u32 frame_sz; u32 flags; /* supported values defined in xdp_buff_flags */ }; @@ -441,6 +442,7 @@ struct xdp_frame *xdp_convert_buff_to_frame(struct xdp_buff *xdp) /* rxq only valid until napi_schedule ends, convert to xdp_mem_type */ xdp_frame->mem_type = xdp->rxq->mem.type; + xdp_frame->rx_queue_index = xdp->rxq->queue_index; return xdp_frame; } diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c index 5e59ab896f05..8f2d7013620f 100644 --- a/kernel/bpf/cpumap.c +++ b/kernel/bpf/cpumap.c @@ -197,7 +197,7 @@ static int cpu_map_bpf_prog_run_xdp(struct bpf_cpu_map_entry *rcpu, rxq.dev = xdpf->dev_rx; rxq.mem.type = xdpf->mem_type; - /* TODO: report queue_index to xdp_rxq_info */ + rxq.queue_index = xdpf->rx_queue_index; xdp_convert_frame_to_buff(xdpf, &xdp); diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index dc7b859e8bbf..f419fa0e53e5 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -339,7 +339,7 @@ static int dev_map_bpf_prog_run(struct bpf_prog *xdp_prog, struct net_device *rx_dev) { struct xdp_txq_info txq = { .dev = tx_dev }; - struct xdp_rxq_info rxq = { .dev = rx_dev }; + struct xdp_rxq_info rxq = { }; struct xdp_buff xdp; int i, nframes = 0; @@ -349,6 +349,9 @@ static int dev_map_bpf_prog_run(struct bpf_prog *xdp_prog, int err; xdp_convert_frame_to_buff(xdpf, &xdp); + rxq.dev = rx_dev; + rxq.mem.type = xdpf->mem_type; + rxq.queue_index = xdpf->rx_queue_index; xdp.txq = &txq; xdp.rxq = &rxq; diff --git a/net/core/xdp.c b/net/core/xdp.c index 9890a30584ba..9691d8dfadf3 100644 --- a/net/core/xdp.c +++ b/net/core/xdp.c @@ -606,6 +606,7 @@ struct xdp_frame *xdp_convert_zc_to_xdp_frame(struct xdp_buff *xdp) xdpf->metasize = metasize; xdpf->frame_sz = PAGE_SIZE; xdpf->mem_type = MEM_TYPE_PAGE_ORDER0; + xdpf->rx_queue_index = xdp->rxq->queue_index; xsk_buff_free(xdp); return xdpf; -- 2.53.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] bpf: preserve rx_queue_index across XDP redirects 2026-06-20 12:13 ` [PATCH 1/2] bpf: preserve rx_queue_index across XDP redirects Siddharth C @ 2026-06-25 1:54 ` Jakub Kicinski 2026-06-25 16:44 ` Alexei Starovoitov 0 siblings, 1 reply; 6+ messages in thread From: Jakub Kicinski @ 2026-06-25 1:54 UTC (permalink / raw) To: Siddharth C; +Cc: ast, hawk, andrii, netdev, bpf, linux-kernel, linux-kselftest On Sat, 20 Jun 2026 12:13:13 +0000 Siddharth C wrote: > diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c > index 5e59ab896f05..8f2d7013620f 100644 > --- a/kernel/bpf/cpumap.c > +++ b/kernel/bpf/cpumap.c > @@ -197,7 +197,7 @@ static int cpu_map_bpf_prog_run_xdp(struct bpf_cpu_map_entry *rcpu, > > rxq.dev = xdpf->dev_rx; > rxq.mem.type = xdpf->mem_type; > - /* TODO: report queue_index to xdp_rxq_info */ > + rxq.queue_index = xdpf->rx_queue_index; Do you actually need this or you're just trying to address the TODO? You can always store the info you need in the metadata prepend. > xdp_convert_frame_to_buff(xdpf, &xdp); > > diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c > index dc7b859e8bbf..f419fa0e53e5 100644 > --- a/kernel/bpf/devmap.c > +++ b/kernel/bpf/devmap.c > @@ -339,7 +339,7 @@ static int dev_map_bpf_prog_run(struct bpf_prog *xdp_prog, > struct net_device *rx_dev) > { > struct xdp_txq_info txq = { .dev = tx_dev }; > - struct xdp_rxq_info rxq = { .dev = rx_dev }; > + struct xdp_rxq_info rxq = { }; > struct xdp_buff xdp; > int i, nframes = 0; > > @@ -349,6 +349,9 @@ static int dev_map_bpf_prog_run(struct bpf_prog *xdp_prog, > int err; > > xdp_convert_frame_to_buff(xdpf, &xdp); > + rxq.dev = rx_dev; > + rxq.mem.type = xdpf->mem_type; Why are you setting mem_type? > + rxq.queue_index = xdpf->rx_queue_index; > xdp.txq = &txq; > xdp.rxq = &rxq; ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] bpf: preserve rx_queue_index across XDP redirects 2026-06-25 1:54 ` Jakub Kicinski @ 2026-06-25 16:44 ` Alexei Starovoitov 2026-06-25 18:35 ` Mehdi Ben Hadj Khelifa 0 siblings, 1 reply; 6+ messages in thread From: Alexei Starovoitov @ 2026-06-25 16:44 UTC (permalink / raw) To: Jakub Kicinski, Siddharth C Cc: ast, hawk, andrii, netdev, bpf, linux-kernel, linux-kselftest On Wed Jun 24, 2026 at 6:54 PM PDT, Jakub Kicinski wrote: > On Sat, 20 Jun 2026 12:13:13 +0000 Siddharth C wrote: >> diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c >> index 5e59ab896f05..8f2d7013620f 100644 >> --- a/kernel/bpf/cpumap.c >> +++ b/kernel/bpf/cpumap.c >> @@ -197,7 +197,7 @@ static int cpu_map_bpf_prog_run_xdp(struct bpf_cpu_map_entry *rcpu, >> >> rxq.dev = xdpf->dev_rx; >> rxq.mem.type = xdpf->mem_type; >> - /* TODO: report queue_index to xdp_rxq_info */ >> + rxq.queue_index = xdpf->rx_queue_index; > > Do you actually need this or you're just trying to address the TODO? It's a 3rd if not 4th attempt from various "people" to address this TODO. We should just remove this line instead. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] bpf: preserve rx_queue_index across XDP redirects 2026-06-25 16:44 ` Alexei Starovoitov @ 2026-06-25 18:35 ` Mehdi Ben Hadj Khelifa 0 siblings, 0 replies; 6+ messages in thread From: Mehdi Ben Hadj Khelifa @ 2026-06-25 18:35 UTC (permalink / raw) To: Alexei Starovoitov, Jakub Kicinski, Siddharth C Cc: ast, hawk, andrii, netdev, bpf, linux-kernel, linux-kselftest On 6/25/26 5:44 PM, Alexei Starovoitov wrote: > On Wed Jun 24, 2026 at 6:54 PM PDT, Jakub Kicinski wrote: >> On Sat, 20 Jun 2026 12:13:13 +0000 Siddharth C wrote: >>> diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c >>> index 5e59ab896f05..8f2d7013620f 100644 >>> --- a/kernel/bpf/cpumap.c >>> +++ b/kernel/bpf/cpumap.c >>> @@ -197,7 +197,7 @@ static int cpu_map_bpf_prog_run_xdp(struct bpf_cpu_map_entry *rcpu, >>> >>> rxq.dev = xdpf->dev_rx; >>> rxq.mem.type = xdpf->mem_type; >>> - /* TODO: report queue_index to xdp_rxq_info */ >>> + rxq.queue_index = xdpf->rx_queue_index; >> >> Do you actually need this or you're just trying to address the TODO? > > It's a 3rd if not 4th attempt from various "people" to address this TODO. > We should just remove this line instead. > I was one of the people that tried this. And also I have already sent a patch to address the misleading comment to prevent future wasted effort. My patch is still on hold (LINK: https://lore.kernel.org/all/20251021114714.1757372-1-mehdi.benhadjkhelifa@gmail.com/). Best Regards, Mehdi Ben Hadj Khelifa ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] selftests/bpf: validate rx_queue_index in xdp_metadata 2026-06-20 12:13 Siddharth C 2026-06-20 12:13 ` [PATCH 1/2] bpf: preserve rx_queue_index across XDP redirects Siddharth C @ 2026-06-20 12:13 ` Siddharth C 1 sibling, 0 replies; 6+ messages in thread From: Siddharth C @ 2026-06-20 12:13 UTC (permalink / raw) To: ast, kuba, hawk, andrii, netdev, bpf, linux-kernel, linux-kselftest Cc: Siddharth_Cibi From: Siddharth_Cibi <siddharthcibi@icloud.com> Extend xdp_metadata selftest coverage to validate that ctx->rx_queue_index is preserved and observable after XDP redirect execution. Capture rx_queue_index in metadata and assert that it matches the expected queue during packet verification. Signed-off-by: Siddharth_Cibi <siddharthcibi@icloud.com> --- tools/testing/selftests/bpf/prog_tests/xdp_metadata.c | 3 ++- tools/testing/selftests/bpf/progs/xdp_metadata.c | 2 +- tools/testing/selftests/bpf/xdp_metadata.h | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c b/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c index 5c31054ad4a4..f8cabbbe7bb7 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_metadata.c @@ -309,7 +309,8 @@ static int verify_xsk_metadata(struct xsk *xsk, bool sent_from_af_xdp) if (!ASSERT_NEQ(meta->rx_hash, 0, "rx_hash")) return -1; - + if (!ASSERT_EQ(meta->rx_queue_index, QUEUE_ID, "rx_queue_index")) + return -1; if (!sent_from_af_xdp) { if (!ASSERT_NEQ(meta->rx_hash_type & XDP_RSS_TYPE_L4, 0, "rx_hash_type")) return -1; diff --git a/tools/testing/selftests/bpf/progs/xdp_metadata.c b/tools/testing/selftests/bpf/progs/xdp_metadata.c index 09bb8a038d52..62ae83860d7f 100644 --- a/tools/testing/selftests/bpf/progs/xdp_metadata.c +++ b/tools/testing/selftests/bpf/progs/xdp_metadata.c @@ -98,7 +98,7 @@ int rx(struct xdp_md *ctx) bpf_xdp_metadata_rx_hash(ctx, &meta->rx_hash, &meta->rx_hash_type); bpf_xdp_metadata_rx_vlan_tag(ctx, &meta->rx_vlan_proto, &meta->rx_vlan_tci); - + meta->rx_queue_index = ctx->rx_queue_index; return bpf_redirect_map(&xsk, ctx->rx_queue_index, XDP_PASS); } diff --git a/tools/testing/selftests/bpf/xdp_metadata.h b/tools/testing/selftests/bpf/xdp_metadata.h index 87318ad1117a..1f0ae4c00091 100644 --- a/tools/testing/selftests/bpf/xdp_metadata.h +++ b/tools/testing/selftests/bpf/xdp_metadata.h @@ -49,4 +49,5 @@ struct xdp_meta { __s32 rx_vlan_tag_err; }; enum xdp_meta_field hint_valid; + __u32 rx_queue_index; }; -- 2.53.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-06-25 17:35 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-06-20 12:13 Siddharth C 2026-06-20 12:13 ` [PATCH 1/2] bpf: preserve rx_queue_index across XDP redirects Siddharth C 2026-06-25 1:54 ` Jakub Kicinski 2026-06-25 16:44 ` Alexei Starovoitov 2026-06-25 18:35 ` Mehdi Ben Hadj Khelifa 2026-06-20 12:13 ` [PATCH 2/2] selftests/bpf: validate rx_queue_index in xdp_metadata Siddharth C
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox