public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX
@ 2026-03-19 17:16 Kohei Enju
  2026-03-19 17:16 ` [PATCH iwl-next v1 1/3] i40e: prepare for XDP metadata ops support Kohei Enju
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Kohei Enju @ 2026-03-19 17:16 UTC (permalink / raw)
  To: intel-wired-lan, netdev
  Cc: Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, kohei.enju, Kohei Enju

This series adds support for XDP metadata ops. Since the i40e RX
timestamps are not available from the RX descriptor in the XDP path,
this series doesn't implement bpf_xdp_metadata_rx_timestamp().

Patch 1/3 prepares i40e_xdp_buff for subsequent patches.
Patch 2/3 and 3/3 introduce bpf_xdp_metadata_rx_hash() and
bpf_xdp_metadata_rx_vlan_tag() respectively.

Tested on Intel Corporation Ethernet Controller X710 for 10GbE SFP+ with
./tools/testing/selftests/bpf/xdp_hw_metadata.
Since i40e doesn't support HWTSTAMP_FILTER_ALL as an rx_filter, I
locally changed the selftest to use HWTSTAMP_FILTER_NONE instead.

Kohei Enju (3):
  i40e: prepare for XDP metadata ops support
  i40e: add support for bpf_xdp_metadata_rx_hash()
  i40e: add support for bpf_xdp_metadata_rx_vlan_tag()

 drivers/net/ethernet/intel/i40e/i40e_main.c | 51 ++++++++++++++++++++-
 drivers/net/ethernet/intel/i40e/i40e_txrx.c |  5 +-
 drivers/net/ethernet/intel/i40e/i40e_txrx.h |  7 ++-
 drivers/net/ethernet/intel/i40e/i40e_type.h |  5 ++
 drivers/net/ethernet/intel/i40e/i40e_xsk.c  | 12 +++++
 5 files changed, 77 insertions(+), 3 deletions(-)

-- 
2.51.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH iwl-next v1 1/3] i40e: prepare for XDP metadata ops support
  2026-03-19 17:16 [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX Kohei Enju
@ 2026-03-19 17:16 ` Kohei Enju
  2026-03-20  6:56   ` [Intel-wired-lan] " Loktionov, Aleksandr
  2026-03-19 17:16 ` [PATCH iwl-next v1 2/3] i40e: add support for bpf_xdp_metadata_rx_hash() Kohei Enju
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Kohei Enju @ 2026-03-19 17:16 UTC (permalink / raw)
  To: intel-wired-lan, netdev
  Cc: Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, kohei.enju, Kohei Enju

Prepare 'struct i40e_xdp_buff' that contains an xdp_buff and a pointer
to i40e_rx_desc in order to pass the RX descriptor to the XDP kfuncs.
Also in ZC path, use XSK_CHECK_PRIV_TYPE() to ensure i40e_xdp_buff
doesn't exceed the offset of cb in xdp_buff_xsk.

No functional changes.

Signed-off-by: Kohei Enju <kohei@enjuk.jp>
---
 drivers/net/ethernet/intel/i40e/i40e_main.c |  2 +-
 drivers/net/ethernet/intel/i40e/i40e_txrx.c |  5 ++++-
 drivers/net/ethernet/intel/i40e/i40e_txrx.h |  7 ++++++-
 drivers/net/ethernet/intel/i40e/i40e_xsk.c  | 12 ++++++++++++
 4 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 31a42ee18aa0..7966d9cb8009 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -3619,7 +3619,7 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
 	}
 
 skip:
-	xdp_init_buff(&ring->xdp, xdp_frame_sz, &ring->xdp_rxq);
+	xdp_init_buff(&ring->xdp_ctx.xdp, xdp_frame_sz, &ring->xdp_rxq);
 
 	rx_ctx.dbuff = DIV_ROUND_UP(ring->rx_buf_len,
 				    BIT_ULL(I40E_RXQ_CTX_DBUFF_SHIFT));
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 4ffdb007c41a..cfaf724ee7ff 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -2438,10 +2438,11 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget,
 			     unsigned int *rx_cleaned)
 {
 	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
+	struct i40e_xdp_buff *xdp_ctx = &rx_ring->xdp_ctx;
 	u16 cleaned_count = I40E_DESC_UNUSED(rx_ring);
 	u16 clean_threshold = rx_ring->count / 2;
 	unsigned int offset = rx_ring->rx_offset;
-	struct xdp_buff *xdp = &rx_ring->xdp;
+	struct xdp_buff *xdp = &xdp_ctx->xdp;
 	unsigned int xdp_xmit = 0;
 	struct bpf_prog *xdp_prog;
 	bool failure = false;
@@ -2530,6 +2531,8 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget,
 		if (neop)
 			continue;
 
+		xdp_ctx->desc = rx_desc;
+
 		xdp_res = i40e_run_xdp(rx_ring, xdp, xdp_prog);
 
 		if (xdp_res) {
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
index e630493e9139..6c6ba42ee00c 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
@@ -283,6 +283,11 @@ struct i40e_rx_buffer {
 	__u32 page_count;
 };
 
+struct i40e_xdp_buff {
+	struct xdp_buff xdp;
+	const union i40e_rx_desc *desc;
+};
+
 struct i40e_queue_stats {
 	u64 packets;
 	u64 bytes;
@@ -345,7 +350,7 @@ struct i40e_ring {
 	 * and to resume packet building for this ring in the next call to
 	 * i40e_clean_rx_ring_irq().
 	 */
-	struct xdp_buff xdp;
+	struct i40e_xdp_buff xdp_ctx;
 
 	/* Next descriptor to be processed; next_to_clean is updated only on
 	 * processing EOP descriptor
diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
index 9f47388eaba5..51a05ce4c7ce 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
@@ -246,6 +246,8 @@ bool i40e_alloc_rx_buffers_zc(struct i40e_ring *rx_ring, u16 count)
 	u32 nb_buffs, i;
 	dma_addr_t dma;
 
+	XSK_CHECK_PRIV_TYPE(struct i40e_xdp_buff);
+
 	rx_desc = I40E_RX_DESC(rx_ring, ntu);
 	xdp = i40e_rx_bi(rx_ring, ntu);
 
@@ -396,6 +398,14 @@ static void i40e_handle_xdp_result_zc(struct i40e_ring *rx_ring,
 	WARN_ON_ONCE(1);
 }
 
+static struct i40e_xdp_buff *xsk_buff_to_i40e_ctx(struct xdp_buff *xdp)
+{
+	/* xdp_buff pointer used by ZC code path is allocated as xdp_buff_xsk.
+	 * i40e_xdp_buff private fields overlap with xdp_buff_xsk->cb.
+	 */
+	return (struct i40e_xdp_buff *)xdp;
+}
+
 /**
  * i40e_clean_rx_irq_zc - Consumes Rx packets from the hardware ring
  * @rx_ring: Rx ring
@@ -472,6 +482,8 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget)
 		if (i40e_is_non_eop(rx_ring, rx_desc))
 			continue;
 
+		xsk_buff_to_i40e_ctx(first)->desc = rx_desc;
+
 		xdp_res = i40e_run_xdp_zc(rx_ring, first, xdp_prog);
 		i40e_handle_xdp_result_zc(rx_ring, first, rx_desc, &rx_packets,
 					  &rx_bytes, xdp_res, &failure);
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH iwl-next v1 2/3] i40e: add support for bpf_xdp_metadata_rx_hash()
  2026-03-19 17:16 [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX Kohei Enju
  2026-03-19 17:16 ` [PATCH iwl-next v1 1/3] i40e: prepare for XDP metadata ops support Kohei Enju
@ 2026-03-19 17:16 ` Kohei Enju
  2026-03-20  6:57   ` [Intel-wired-lan] " Loktionov, Aleksandr
  2026-03-19 17:16 ` [PATCH iwl-next v1 3/3] i40e: add support for bpf_xdp_metadata_rx_vlan_tag() Kohei Enju
  2026-03-20 23:09 ` [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX Joe Damato
  3 siblings, 1 reply; 8+ messages in thread
From: Kohei Enju @ 2026-03-19 17:16 UTC (permalink / raw)
  To: intel-wired-lan, netdev
  Cc: Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, kohei.enju, Kohei Enju

Introduce i40e_xdp_rx_hash() which takes the same approach as
i40e_rx_hash() to extract the hash from RX descriptors.

Tested with X710 adapter using xdp_hw_metadata, and verified hash
consistency between bpf_xdp_metadata_rx_hash() and skb->hash.

Signed-off-by: Kohei Enju <kohei@enjuk.jp>
---
 drivers/net/ethernet/intel/i40e/i40e_main.c | 30 +++++++++++++++++++++
 drivers/net/ethernet/intel/i40e/i40e_type.h |  5 ++++
 2 files changed, 35 insertions(+)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 7966d9cb8009..6b7e34b16a8d 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -4,6 +4,7 @@
 #include <generated/utsrelease.h>
 #include <linux/crash_dump.h>
 #include <linux/intel/libie/pctype.h>
+#include <linux/intel/libie/rx.h>
 #include <linux/if_bridge.h>
 #include <linux/if_macvlan.h>
 #include <linux/module.h>
@@ -13585,6 +13586,34 @@ static int i40e_xdp(struct net_device *dev,
 	}
 }
 
+static int i40e_xdp_rx_hash(const struct xdp_md *_ctx, u32 *hash,
+			    enum xdp_rss_hash_type *rss_type)
+{
+	const struct i40e_xdp_buff *ctx = (const void *)_ctx;
+	const union i40e_rx_desc *desc = ctx->desc;
+	struct libeth_rx_pt rx_ptype;
+	u8 raw_rx_ptype;
+	u64 status;
+
+	status = le64_to_cpu(desc->wb.qword1.status_error_len);
+	raw_rx_ptype = FIELD_GET(I40E_RXD_QW1_PTYPE_MASK, status);
+	rx_ptype = libie_rx_pt_parse(raw_rx_ptype);
+
+	if (!libeth_rx_pt_has_hash(ctx->xdp.rxq->dev, rx_ptype) ||
+	    FIELD_GET(I40E_RX_DESC_STATUS_FLTSTAT_MASK, status) !=
+		    I40E_RX_DESC_FLTSTAT_RSS_HASH)
+		return -ENODATA;
+
+	*hash = le32_to_cpu(desc->wb.qword0.hi_dword.rss);
+	*rss_type = rx_ptype.hash_type;
+
+	return 0;
+}
+
+static const struct xdp_metadata_ops i40e_xdp_metadata_ops = {
+	.xmo_rx_hash		= i40e_xdp_rx_hash,
+};
+
 static const struct net_device_ops i40e_netdev_ops = {
 	.ndo_open		= i40e_open,
 	.ndo_stop		= i40e_close,
@@ -13788,6 +13817,7 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
 	i40e_vsi_config_netdev_tc(vsi, vsi->tc_config.enabled_tc);
 
 	netdev->netdev_ops = &i40e_netdev_ops;
+	netdev->xdp_metadata_ops = &i40e_xdp_metadata_ops;
 	netdev->watchdog_timeo = 5 * HZ;
 	i40e_set_ethtool_ops(netdev);
 
diff --git a/drivers/net/ethernet/intel/i40e/i40e_type.h b/drivers/net/ethernet/intel/i40e/i40e_type.h
index ed8bbdb586da..16a65c6e5153 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_type.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_type.h
@@ -4,6 +4,7 @@
 #ifndef _I40E_TYPE_H_
 #define _I40E_TYPE_H_
 
+#include <linux/bits.h>
 #include <uapi/linux/if_ether.h>
 #include "i40e_adminq.h"
 #include "i40e_hmc.h"
@@ -699,6 +700,10 @@ enum i40e_rx_desc_status_bits {
 	I40E_RX_DESC_STATUS_LAST /* this entry must be last!!! */
 };
 
+#define I40E_RX_DESC_STATUS_FLTSTAT_MASK                   \
+	GENMASK_ULL(I40E_RX_DESC_STATUS_FLTSTAT_SHIFT + 1, \
+		    I40E_RX_DESC_STATUS_FLTSTAT_SHIFT)
+
 #define I40E_RXD_QW1_STATUS_SHIFT	0
 #define I40E_RXD_QW1_STATUS_MASK	((BIT(I40E_RX_DESC_STATUS_LAST) - 1) \
 					 << I40E_RXD_QW1_STATUS_SHIFT)
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH iwl-next v1 3/3] i40e: add support for bpf_xdp_metadata_rx_vlan_tag()
  2026-03-19 17:16 [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX Kohei Enju
  2026-03-19 17:16 ` [PATCH iwl-next v1 1/3] i40e: prepare for XDP metadata ops support Kohei Enju
  2026-03-19 17:16 ` [PATCH iwl-next v1 2/3] i40e: add support for bpf_xdp_metadata_rx_hash() Kohei Enju
@ 2026-03-19 17:16 ` Kohei Enju
  2026-03-20  6:57   ` [Intel-wired-lan] " Loktionov, Aleksandr
  2026-03-20 23:09 ` [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX Joe Damato
  3 siblings, 1 reply; 8+ messages in thread
From: Kohei Enju @ 2026-03-19 17:16 UTC (permalink / raw)
  To: intel-wired-lan, netdev
  Cc: Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, kohei.enju, Kohei Enju

Introduce i40e_xdp_rx_vlan_tag() which takes the same approach as
i40e_process_skb_fields() to extract the VLAN tag from the RX
descriptor.

Tested with X710 adapter using xdp_hw_metadata, and confirmed that VLAN
tags match between bpf_xdp_metadata_rx_vlan_tag() and
skb->vlan_proto/vlan_tci.

Signed-off-by: Kohei Enju <kohei@enjuk.jp>
---
 drivers/net/ethernet/intel/i40e/i40e_main.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 6b7e34b16a8d..3749f32ef95a 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -13610,8 +13610,27 @@ static int i40e_xdp_rx_hash(const struct xdp_md *_ctx, u32 *hash,
 	return 0;
 }
 
+static int i40e_xdp_rx_vlan_tag(const struct xdp_md *_ctx, __be16 *vlan_proto,
+				u16 *vlan_tci)
+{
+	const struct i40e_xdp_buff *ctx = (const void *)_ctx;
+	const union i40e_rx_desc *desc = ctx->desc;
+	u64 status;
+
+	status = le64_to_cpu(desc->wb.qword1.status_error_len);
+
+	if (!(status & BIT(I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)))
+		return -ENODATA;
+
+	*vlan_proto = cpu_to_be16(ETH_P_8021Q);
+	*vlan_tci = le16_to_cpu(desc->wb.qword0.lo_dword.l2tag1);
+
+	return 0;
+}
+
 static const struct xdp_metadata_ops i40e_xdp_metadata_ops = {
 	.xmo_rx_hash		= i40e_xdp_rx_hash,
+	.xmo_rx_vlan_tag	= i40e_xdp_rx_vlan_tag,
 };
 
 static const struct net_device_ops i40e_netdev_ops = {
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* RE: [Intel-wired-lan] [PATCH iwl-next v1 1/3] i40e: prepare for XDP metadata ops support
  2026-03-19 17:16 ` [PATCH iwl-next v1 1/3] i40e: prepare for XDP metadata ops support Kohei Enju
@ 2026-03-20  6:56   ` Loktionov, Aleksandr
  0 siblings, 0 replies; 8+ messages in thread
From: Loktionov, Aleksandr @ 2026-03-20  6:56 UTC (permalink / raw)
  To: Kohei Enju, intel-wired-lan@lists.osuosl.org,
	netdev@vger.kernel.org
  Cc: Nguyen, Anthony L, Kitszel, Przemyslaw, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	kohei.enju@gmail.com



> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf
> Of Kohei Enju
> Sent: Thursday, March 19, 2026 6:17 PM
> To: intel-wired-lan@lists.osuosl.org; netdev@vger.kernel.org
> Cc: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; Kitszel,
> Przemyslaw <przemyslaw.kitszel@intel.com>; Andrew Lunn
> <andrew+netdev@lunn.ch>; David S. Miller <davem@davemloft.net>; Eric
> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo
> Abeni <pabeni@redhat.com>; kohei.enju@gmail.com; Kohei Enju
> <kohei@enjuk.jp>
> Subject: [Intel-wired-lan] [PATCH iwl-next v1 1/3] i40e: prepare for
> XDP metadata ops support
> 
> Prepare 'struct i40e_xdp_buff' that contains an xdp_buff and a pointer
> to i40e_rx_desc in order to pass the RX descriptor to the XDP kfuncs.
> Also in ZC path, use XSK_CHECK_PRIV_TYPE() to ensure i40e_xdp_buff
> doesn't exceed the offset of cb in xdp_buff_xsk.
> 
> No functional changes.
> 
> Signed-off-by: Kohei Enju <kohei@enjuk.jp>
> ---
>  drivers/net/ethernet/intel/i40e/i40e_main.c |  2 +-
> drivers/net/ethernet/intel/i40e/i40e_txrx.c |  5 ++++-
> drivers/net/ethernet/intel/i40e/i40e_txrx.h |  7 ++++++-
> drivers/net/ethernet/intel/i40e/i40e_xsk.c  | 12 ++++++++++++
>  4 files changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 31a42ee18aa0..7966d9cb8009 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -3619,7 +3619,7 @@ static int i40e_configure_rx_ring(struct
> i40e_ring *ring)
>  	}
> 
>  skip:
> -	xdp_init_buff(&ring->xdp, xdp_frame_sz, &ring->xdp_rxq);
> +	xdp_init_buff(&ring->xdp_ctx.xdp, xdp_frame_sz, &ring-
> >xdp_rxq);
> 
>  	rx_ctx.dbuff = DIV_ROUND_UP(ring->rx_buf_len,
>  				    BIT_ULL(I40E_RXQ_CTX_DBUFF_SHIFT));
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> index 4ffdb007c41a..cfaf724ee7ff 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> @@ -2438,10 +2438,11 @@ static int i40e_clean_rx_irq(struct i40e_ring
> *rx_ring, int budget,
>  			     unsigned int *rx_cleaned)
>  {
>  	unsigned int total_rx_bytes = 0, total_rx_packets = 0;

...

>  		xdp_res = i40e_run_xdp_zc(rx_ring, first, xdp_prog);
>  		i40e_handle_xdp_result_zc(rx_ring, first, rx_desc,
> &rx_packets,
>  					  &rx_bytes, xdp_res, &failure);
> --
> 2.51.0

Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [Intel-wired-lan] [PATCH iwl-next v1 2/3] i40e: add support for bpf_xdp_metadata_rx_hash()
  2026-03-19 17:16 ` [PATCH iwl-next v1 2/3] i40e: add support for bpf_xdp_metadata_rx_hash() Kohei Enju
@ 2026-03-20  6:57   ` Loktionov, Aleksandr
  0 siblings, 0 replies; 8+ messages in thread
From: Loktionov, Aleksandr @ 2026-03-20  6:57 UTC (permalink / raw)
  To: Kohei Enju, intel-wired-lan@lists.osuosl.org,
	netdev@vger.kernel.org
  Cc: Nguyen, Anthony L, Kitszel, Przemyslaw, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	kohei.enju@gmail.com



> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf
> Of Kohei Enju
> Sent: Thursday, March 19, 2026 6:17 PM
> To: intel-wired-lan@lists.osuosl.org; netdev@vger.kernel.org
> Cc: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; Kitszel,
> Przemyslaw <przemyslaw.kitszel@intel.com>; Andrew Lunn
> <andrew+netdev@lunn.ch>; David S. Miller <davem@davemloft.net>; Eric
> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo
> Abeni <pabeni@redhat.com>; kohei.enju@gmail.com; Kohei Enju
> <kohei@enjuk.jp>
> Subject: [Intel-wired-lan] [PATCH iwl-next v1 2/3] i40e: add support
> for bpf_xdp_metadata_rx_hash()
> 
> Introduce i40e_xdp_rx_hash() which takes the same approach as
> i40e_rx_hash() to extract the hash from RX descriptors.
> 
> Tested with X710 adapter using xdp_hw_metadata, and verified hash
> consistency between bpf_xdp_metadata_rx_hash() and skb->hash.
> 
> Signed-off-by: Kohei Enju <kohei@enjuk.jp>
> ---
>  drivers/net/ethernet/intel/i40e/i40e_main.c | 30
> +++++++++++++++++++++  drivers/net/ethernet/intel/i40e/i40e_type.h |
> 5 ++++
>  2 files changed, 35 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 7966d9cb8009..6b7e34b16a8d 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -4,6 +4,7 @@
>  #include <generated/utsrelease.h>
>  #include <linux/crash_dump.h>
>  #include <linux/intel/libie/pctype.h>
> +#include <linux/intel/libie/rx.h>
>  #include <linux/if_bridge.h>
>  #include <linux/if_macvlan.h>
>  #include <linux/module.h>
> @@ -13585,6 +13586,34 @@ static int i40e_xdp(struct net_device *dev,
>  	}
>  }
> 
> +static int i40e_xdp_rx_hash(const struct xdp_md *_ctx, u32 *hash,
> +			    enum xdp_rss_hash_type *rss_type) {
> +	const struct i40e_xdp_buff *ctx = (const void *)_ctx;
> +	const union i40e_rx_desc *desc = ctx->desc;
> +	struct libeth_rx_pt rx_ptype;
> +	u8 raw_rx_ptype;
> +	u64 status;
> +
> +	status = le64_to_cpu(desc->wb.qword1.status_error_len);
> +	raw_rx_ptype = FIELD_GET(I40E_RXD_QW1_PTYPE_MASK, status);
> +	rx_ptype = libie_rx_pt_parse(raw_rx_ptype);
> +
> +	if (!libeth_rx_pt_has_hash(ctx->xdp.rxq->dev, rx_ptype) ||
> +	    FIELD_GET(I40E_RX_DESC_STATUS_FLTSTAT_MASK, status) !=
> +		    I40E_RX_DESC_FLTSTAT_RSS_HASH)
> +		return -ENODATA;
> +
> +	*hash = le32_to_cpu(desc->wb.qword0.hi_dword.rss);
> +	*rss_type = rx_ptype.hash_type;
> +
> +	return 0;
> +}
> +
> +static const struct xdp_metadata_ops i40e_xdp_metadata_ops = {
> +	.xmo_rx_hash		= i40e_xdp_rx_hash,
> +};
> +
>  static const struct net_device_ops i40e_netdev_ops = {
>  	.ndo_open		= i40e_open,
>  	.ndo_stop		= i40e_close,
> @@ -13788,6 +13817,7 @@ static int i40e_config_netdev(struct i40e_vsi
> *vsi)
>  	i40e_vsi_config_netdev_tc(vsi, vsi->tc_config.enabled_tc);
> 
>  	netdev->netdev_ops = &i40e_netdev_ops;
> +	netdev->xdp_metadata_ops = &i40e_xdp_metadata_ops;
>  	netdev->watchdog_timeo = 5 * HZ;
>  	i40e_set_ethtool_ops(netdev);
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_type.h
> b/drivers/net/ethernet/intel/i40e/i40e_type.h
> index ed8bbdb586da..16a65c6e5153 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_type.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e_type.h
> @@ -4,6 +4,7 @@
>  #ifndef _I40E_TYPE_H_
>  #define _I40E_TYPE_H_
> 
> +#include <linux/bits.h>
>  #include <uapi/linux/if_ether.h>
>  #include "i40e_adminq.h"
>  #include "i40e_hmc.h"
> @@ -699,6 +700,10 @@ enum i40e_rx_desc_status_bits {
>  	I40E_RX_DESC_STATUS_LAST /* this entry must be last!!! */  };
> 
> +#define I40E_RX_DESC_STATUS_FLTSTAT_MASK                   \
> +	GENMASK_ULL(I40E_RX_DESC_STATUS_FLTSTAT_SHIFT + 1, \
> +		    I40E_RX_DESC_STATUS_FLTSTAT_SHIFT)
> +
>  #define I40E_RXD_QW1_STATUS_SHIFT	0
>  #define I40E_RXD_QW1_STATUS_MASK	((BIT(I40E_RX_DESC_STATUS_LAST) - 1)
> \
>  					 << I40E_RXD_QW1_STATUS_SHIFT)
> --
> 2.51.0

Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [Intel-wired-lan] [PATCH iwl-next v1 3/3] i40e: add support for bpf_xdp_metadata_rx_vlan_tag()
  2026-03-19 17:16 ` [PATCH iwl-next v1 3/3] i40e: add support for bpf_xdp_metadata_rx_vlan_tag() Kohei Enju
@ 2026-03-20  6:57   ` Loktionov, Aleksandr
  0 siblings, 0 replies; 8+ messages in thread
From: Loktionov, Aleksandr @ 2026-03-20  6:57 UTC (permalink / raw)
  To: Kohei Enju, intel-wired-lan@lists.osuosl.org,
	netdev@vger.kernel.org
  Cc: Nguyen, Anthony L, Kitszel, Przemyslaw, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	kohei.enju@gmail.com



> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf
> Of Kohei Enju
> Sent: Thursday, March 19, 2026 6:17 PM
> To: intel-wired-lan@lists.osuosl.org; netdev@vger.kernel.org
> Cc: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; Kitszel,
> Przemyslaw <przemyslaw.kitszel@intel.com>; Andrew Lunn
> <andrew+netdev@lunn.ch>; David S. Miller <davem@davemloft.net>; Eric
> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo
> Abeni <pabeni@redhat.com>; kohei.enju@gmail.com; Kohei Enju
> <kohei@enjuk.jp>
> Subject: [Intel-wired-lan] [PATCH iwl-next v1 3/3] i40e: add support
> for bpf_xdp_metadata_rx_vlan_tag()
> 
> Introduce i40e_xdp_rx_vlan_tag() which takes the same approach as
> i40e_process_skb_fields() to extract the VLAN tag from the RX
> descriptor.
> 
> Tested with X710 adapter using xdp_hw_metadata, and confirmed that
> VLAN tags match between bpf_xdp_metadata_rx_vlan_tag() and
> skb->vlan_proto/vlan_tci.
> 
> Signed-off-by: Kohei Enju <kohei@enjuk.jp>
> ---
>  drivers/net/ethernet/intel/i40e/i40e_main.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 6b7e34b16a8d..3749f32ef95a 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -13610,8 +13610,27 @@ static int i40e_xdp_rx_hash(const struct
> xdp_md *_ctx, u32 *hash,
>  	return 0;
>  }
> 
> +static int i40e_xdp_rx_vlan_tag(const struct xdp_md *_ctx, __be16
> *vlan_proto,
> +				u16 *vlan_tci)
> +{
> +	const struct i40e_xdp_buff *ctx = (const void *)_ctx;
> +	const union i40e_rx_desc *desc = ctx->desc;
> +	u64 status;
> +
> +	status = le64_to_cpu(desc->wb.qword1.status_error_len);
> +
> +	if (!(status & BIT(I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)))
> +		return -ENODATA;
> +
> +	*vlan_proto = cpu_to_be16(ETH_P_8021Q);
> +	*vlan_tci = le16_to_cpu(desc->wb.qword0.lo_dword.l2tag1);
> +
> +	return 0;
> +}
> +
>  static const struct xdp_metadata_ops i40e_xdp_metadata_ops = {
>  	.xmo_rx_hash		= i40e_xdp_rx_hash,
> +	.xmo_rx_vlan_tag	= i40e_xdp_rx_vlan_tag,
>  };
> 
>  static const struct net_device_ops i40e_netdev_ops = {
> --
> 2.51.0

Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX
  2026-03-19 17:16 [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX Kohei Enju
                   ` (2 preceding siblings ...)
  2026-03-19 17:16 ` [PATCH iwl-next v1 3/3] i40e: add support for bpf_xdp_metadata_rx_vlan_tag() Kohei Enju
@ 2026-03-20 23:09 ` Joe Damato
  3 siblings, 0 replies; 8+ messages in thread
From: Joe Damato @ 2026-03-20 23:09 UTC (permalink / raw)
  To: Kohei Enju
  Cc: intel-wired-lan, netdev, Tony Nguyen, Przemek Kitszel,
	Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, kohei.enju

On Thu, Mar 19, 2026 at 05:16:41PM +0000, Kohei Enju wrote:
> This series adds support for XDP metadata ops. Since the i40e RX
> timestamps are not available from the RX descriptor in the XDP path,
> this series doesn't implement bpf_xdp_metadata_rx_timestamp().
> 
> Patch 1/3 prepares i40e_xdp_buff for subsequent patches.
> Patch 2/3 and 3/3 introduce bpf_xdp_metadata_rx_hash() and
> bpf_xdp_metadata_rx_vlan_tag() respectively.
> 
> Tested on Intel Corporation Ethernet Controller X710 for 10GbE SFP+ with
> ./tools/testing/selftests/bpf/xdp_hw_metadata.
> Since i40e doesn't support HWTSTAMP_FILTER_ALL as an rx_filter, I
> locally changed the selftest to use HWTSTAMP_FILTER_NONE instead.
> 
> Kohei Enju (3):
>   i40e: prepare for XDP metadata ops support
>   i40e: add support for bpf_xdp_metadata_rx_hash()
>   i40e: add support for bpf_xdp_metadata_rx_vlan_tag()
> 
>  drivers/net/ethernet/intel/i40e/i40e_main.c | 51 ++++++++++++++++++++-
>  drivers/net/ethernet/intel/i40e/i40e_txrx.c |  5 +-
>  drivers/net/ethernet/intel/i40e/i40e_txrx.h |  7 ++-
>  drivers/net/ethernet/intel/i40e/i40e_type.h |  5 ++
>  drivers/net/ethernet/intel/i40e/i40e_xsk.c  | 12 +++++
>  5 files changed, 77 insertions(+), 3 deletions(-)

For the series:

Reviewed-by: Joe Damato <joe@dama.to>

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-03-20 23:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-19 17:16 [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX Kohei Enju
2026-03-19 17:16 ` [PATCH iwl-next v1 1/3] i40e: prepare for XDP metadata ops support Kohei Enju
2026-03-20  6:56   ` [Intel-wired-lan] " Loktionov, Aleksandr
2026-03-19 17:16 ` [PATCH iwl-next v1 2/3] i40e: add support for bpf_xdp_metadata_rx_hash() Kohei Enju
2026-03-20  6:57   ` [Intel-wired-lan] " Loktionov, Aleksandr
2026-03-19 17:16 ` [PATCH iwl-next v1 3/3] i40e: add support for bpf_xdp_metadata_rx_vlan_tag() Kohei Enju
2026-03-20  6:57   ` [Intel-wired-lan] " Loktionov, Aleksandr
2026-03-20 23:09 ` [PATCH iwl-next v1 0/3] i40e: support XDP metadata ops (RX Joe Damato

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox