* [PATCH net-next 1/3] xsk: align TX metadata layout across ABIs
2026-08-10 18:47 [PATCH net-next 0/3] xsk: pre-existing AF_XDP TX metadata fixes from Sashiko Stanislav Fomichev
@ 2026-08-10 18:47 ` Stanislav Fomichev
2026-08-10 18:47 ` [PATCH net-next 2/3] xsk: honor XDP_TX_METADATA in zero-copy path Stanislav Fomichev
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Stanislav Fomichev @ 2026-08-10 18:47 UTC (permalink / raw)
To: netdev
Cc: davem, edumazet, kuba, pabeni, anthony.l.nguyen,
przemyslaw.kitszel, andrew+netdev, saeedm, tariqt, mbloch,
maxime.chevallier, mcoquelin.stm32, alexandre.torgue,
aleksander.lobakin, horms, magnus.karlsson, maciej.fijalkowski,
sdf, ast, daniel, hawk, john.fastabend, alice.kernel, dtatulea,
witu, martin.lau, yoong.siang.song, rohan.g.thomas,
intel-wired-lan, linux-kernel, linux-rdma, linux-stm32,
linux-arm-kernel, bpf, leon
Add explicit padding before launch_time so xsk_tx_metadata has the same
layout on 32-bit and 64-bit systems. This intentionally replaces the
incompatible 32-bit launch-time layout while the interface is still new.
Fixes: ca4419f15abd ("xsk: Add launch time hardware offload support to XDP Tx metadata")
Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
---
include/uapi/linux/if_xdp.h | 1 +
tools/include/uapi/linux/if_xdp.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/include/uapi/linux/if_xdp.h b/include/uapi/linux/if_xdp.h
index 23a062781468..50d67df78911 100644
--- a/include/uapi/linux/if_xdp.h
+++ b/include/uapi/linux/if_xdp.h
@@ -149,6 +149,7 @@ struct xsk_tx_metadata {
__u16 csum_start;
/* Offset from csum_start where checksum should be stored. */
__u16 csum_offset;
+ __u32 reserved;
/* XDP_TXMD_FLAGS_LAUNCH_TIME */
/* Launch time in nanosecond against the PTP HW Clock */
diff --git a/tools/include/uapi/linux/if_xdp.h b/tools/include/uapi/linux/if_xdp.h
index 23a062781468..50d67df78911 100644
--- a/tools/include/uapi/linux/if_xdp.h
+++ b/tools/include/uapi/linux/if_xdp.h
@@ -149,6 +149,7 @@ struct xsk_tx_metadata {
__u16 csum_start;
/* Offset from csum_start where checksum should be stored. */
__u16 csum_offset;
+ __u32 reserved;
/* XDP_TXMD_FLAGS_LAUNCH_TIME */
/* Launch time in nanosecond against the PTP HW Clock */
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH net-next 2/3] xsk: honor XDP_TX_METADATA in zero-copy path
2026-08-10 18:47 [PATCH net-next 0/3] xsk: pre-existing AF_XDP TX metadata fixes from Sashiko Stanislav Fomichev
2026-08-10 18:47 ` [PATCH net-next 1/3] xsk: align TX metadata layout across ABIs Stanislav Fomichev
@ 2026-08-10 18:47 ` Stanislav Fomichev
2026-08-10 18:47 ` [PATCH net-next 3/3] net: stmmac: skip queueMaxSDU check for AF_XDP Stanislav Fomichev
2026-08-10 18:52 ` [PATCH net-next 0/3] xsk: pre-existing AF_XDP TX metadata fixes from Sashiko Stanislav Fomichev
3 siblings, 0 replies; 6+ messages in thread
From: Stanislav Fomichev @ 2026-08-10 18:47 UTC (permalink / raw)
To: netdev
Cc: davem, edumazet, kuba, pabeni, anthony.l.nguyen,
przemyslaw.kitszel, andrew+netdev, saeedm, tariqt, mbloch,
maxime.chevallier, mcoquelin.stm32, alexandre.torgue,
aleksander.lobakin, horms, magnus.karlsson, maciej.fijalkowski,
sdf, ast, daniel, hawk, john.fastabend, alice.kernel, dtatulea,
witu, martin.lau, yoong.siang.song, rohan.g.thomas,
intel-wired-lan, linux-kernel, linux-rdma, linux-stm32,
linux-arm-kernel, bpf, leon
The zero-copy path reads TX metadata whenever the UMEM has metadata space,
even if the descriptor does not set XDP_TX_METADATA. Pass descriptor
options through the metadata helpers and ignore metadata unless the option
is set.
This does not change the existing per-WQE metadata handling for mlx5
MPWQEs, where the descriptor that starts a session configures offload state
shared by the batch. Supporting mixed metadata states within one MPWQE
requires a separate fix.
Fixes: 48eb03dd2630 ("xsk: Add TX timestamp and TX checksum offload support")
Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
---
drivers/net/ethernet/intel/igc/igc_main.c | 3 ++-
.../ethernet/mellanox/mlx5/core/en/xsk/tx.c | 2 +-
.../net/ethernet/stmicro/stmmac/stmmac_main.c | 3 ++-
include/net/libeth/xsk.h | 2 +-
include/net/xdp_sock_drv.h | 22 +++++++++++--------
include/net/xsk_buff_pool.h | 3 ++-
net/xdp/xsk_buff_pool.c | 7 ++++--
7 files changed, 26 insertions(+), 16 deletions(-)
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index 8b9ce7cbfff9..1fb5f3cbe93c 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -3071,7 +3071,8 @@ static void igc_xdp_xmit_zc(struct igc_ring *ring)
olinfo_status = xdp_desc.len << IGC_ADVTXD_PAYLEN_SHIFT;
dma = xsk_buff_raw_get_dma(pool, xdp_desc.addr);
- meta = xsk_buff_get_metadata(pool, xdp_desc.addr);
+ meta = xsk_buff_get_metadata(pool, xdp_desc.addr,
+ xdp_desc.options);
xsk_buff_raw_dma_sync_for_device(pool, dma, xdp_desc.len);
bi = &ring->tx_buffer_info[ntu];
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
index 3d19dad8f868..d194eeddd7b5 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
@@ -99,7 +99,7 @@ bool mlx5e_xsk_tx(struct mlx5e_xdpsq *sq, unsigned int budget)
xdptxd.dma_addr = xsk_buff_raw_get_dma(pool, desc.addr);
xdptxd.data = xsk_buff_raw_get_data(pool, desc.addr);
xdptxd.len = desc.len;
- meta = xsk_buff_get_metadata(pool, desc.addr);
+ meta = xsk_buff_get_metadata(pool, desc.addr, desc.options);
xsk_buff_raw_dma_sync_for_device(pool, xdptxd.dma_addr, xdptxd.len);
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index b2b7d0242dd3..efa35cfecc4f 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2723,7 +2723,8 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
tx_desc = stmmac_get_tx_desc(priv, tx_q, entry);
dma_addr = xsk_buff_raw_get_dma(pool, xdp_desc.addr);
- meta = xsk_buff_get_metadata(pool, xdp_desc.addr);
+ meta = xsk_buff_get_metadata(pool, xdp_desc.addr,
+ xdp_desc.options);
xsk_buff_raw_dma_sync_for_device(pool, dma_addr, xdp_desc.len);
/* To return XDP buffer to XSK pool, we simple call
diff --git a/include/net/libeth/xsk.h b/include/net/libeth/xsk.h
index 5dcc0d7f65b7..a452b7828ce4 100644
--- a/include/net/libeth/xsk.h
+++ b/include/net/libeth/xsk.h
@@ -196,7 +196,7 @@ __libeth_xsk_xmit_fill_buf_md(const struct xdp_desc *xdesc,
struct libeth_xdp_tx_desc desc;
struct xdp_desc_ctx ctx;
- ctx = xsk_buff_raw_get_ctx(sq->pool, xdesc->addr);
+ ctx = xsk_buff_raw_get_ctx(sq->pool, xdesc->addr, xdesc->options);
desc = (typeof(desc)){
.addr = ctx.dma,
__libeth_xdp_tx_len(xdesc->len),
diff --git a/include/net/xdp_sock_drv.h b/include/net/xdp_sock_drv.h
index b344789f5df8..d94aeb506379 100644
--- a/include/net/xdp_sock_drv.h
+++ b/include/net/xdp_sock_drv.h
@@ -240,6 +240,7 @@ static inline void *xsk_buff_raw_get_data(struct xsk_buff_pool *pool, u64 addr)
* xsk_buff_raw_get_ctx - get &xdp_desc context
* @pool: XSk buff pool desc address belongs to
* @addr: desc address (from userspace)
+ * @options: desc options (from userspace)
*
* Wrapper for xp_raw_get_ctx() to be used in drivers, see its kdoc for
* details.
@@ -248,9 +249,9 @@ static inline void *xsk_buff_raw_get_data(struct xsk_buff_pool *pool, u64 addr)
* pointer, if it is present (initialized to %NULL otherwise).
*/
static inline struct xdp_desc_ctx
-xsk_buff_raw_get_ctx(const struct xsk_buff_pool *pool, u64 addr)
+xsk_buff_raw_get_ctx(const struct xsk_buff_pool *pool, u64 addr, u32 options)
{
- return xp_raw_get_ctx(pool, addr);
+ return xp_raw_get_ctx(pool, addr, options);
}
#define XDP_TXMD_FLAGS_VALID ( \
@@ -318,18 +319,20 @@ xsk_tx_metadata_request(const struct xsk_buff_pool *pool,
}
static inline struct xsk_tx_metadata *
-__xsk_buff_get_metadata(const struct xsk_buff_pool *pool, void *data)
+__xsk_buff_get_metadata(const struct xsk_buff_pool *pool, void *data,
+ unsigned int options)
{
- if (!pool->tx_metadata_len)
+ if (!pool->tx_metadata_len || !(options & XDP_TX_METADATA))
return NULL;
return data - pool->tx_metadata_len;
}
static inline struct xsk_tx_metadata *
-xsk_buff_get_metadata(struct xsk_buff_pool *pool, u64 addr)
+xsk_buff_get_metadata(struct xsk_buff_pool *pool, u64 addr, u32 options)
{
- return __xsk_buff_get_metadata(pool, xp_raw_get_data(pool, addr));
+ return __xsk_buff_get_metadata(pool, xp_raw_get_data(pool, addr),
+ options);
}
static inline void xsk_buff_dma_sync_for_cpu(struct xdp_buff *xdp)
@@ -510,7 +513,7 @@ static inline void *xsk_buff_raw_get_data(struct xsk_buff_pool *pool, u64 addr)
}
static inline struct xdp_desc_ctx
-xsk_buff_raw_get_ctx(const struct xsk_buff_pool *pool, u64 addr)
+xsk_buff_raw_get_ctx(const struct xsk_buff_pool *pool, u64 addr, u32 options)
{
return (struct xdp_desc_ctx){ };
}
@@ -530,13 +533,14 @@ xsk_tx_metadata_request(const struct xsk_buff_pool *pool,
}
static inline struct xsk_tx_metadata *
-__xsk_buff_get_metadata(const struct xsk_buff_pool *pool, void *data)
+__xsk_buff_get_metadata(const struct xsk_buff_pool *pool, void *data,
+ unsigned int options)
{
return NULL;
}
static inline struct xsk_tx_metadata *
-xsk_buff_get_metadata(struct xsk_buff_pool *pool, u64 addr)
+xsk_buff_get_metadata(struct xsk_buff_pool *pool, u64 addr, u32 options)
{
return NULL;
}
diff --git a/include/net/xsk_buff_pool.h b/include/net/xsk_buff_pool.h
index 2bb1d122b1bc..a7df573784fd 100644
--- a/include/net/xsk_buff_pool.h
+++ b/include/net/xsk_buff_pool.h
@@ -154,7 +154,8 @@ struct xdp_desc_ctx {
struct xsk_tx_metadata *meta;
};
-struct xdp_desc_ctx xp_raw_get_ctx(const struct xsk_buff_pool *pool, u64 addr);
+struct xdp_desc_ctx xp_raw_get_ctx(const struct xsk_buff_pool *pool, u64 addr,
+ u32 options);
static inline dma_addr_t xp_get_dma(struct xdp_buff_xsk *xskb)
{
diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c
index 78c14f106395..9d2d94f1fb75 100644
--- a/net/xdp/xsk_buff_pool.c
+++ b/net/xdp/xsk_buff_pool.c
@@ -763,6 +763,7 @@ EXPORT_SYMBOL(xp_raw_get_dma);
* xp_raw_get_ctx - get &xdp_desc context
* @pool: XSk buff pool desc address belongs to
* @addr: desc address (from userspace)
+ * @options: desc options (from userspace)
*
* Helper for getting desc's DMA address and metadata pointer, if present.
* Saves one call on hotpath and double calculation of the actual address.
@@ -771,14 +772,16 @@ EXPORT_SYMBOL(xp_raw_get_dma);
* Return: new &xdp_desc_ctx struct containing desc's DMA address and metadata
* pointer, if it is present (initialized to %NULL otherwise).
*/
-struct xdp_desc_ctx xp_raw_get_ctx(const struct xsk_buff_pool *pool, u64 addr)
+struct xdp_desc_ctx xp_raw_get_ctx(const struct xsk_buff_pool *pool, u64 addr,
+ u32 options)
{
struct xdp_desc_ctx ret;
addr = __xp_raw_get_addr(pool, addr);
ret.dma = __xp_raw_get_dma(pool, addr);
- ret.meta = __xsk_buff_get_metadata(pool, __xp_raw_get_data(pool, addr));
+ ret.meta = __xsk_buff_get_metadata(pool, __xp_raw_get_data(pool, addr),
+ options);
return ret;
}
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH net-next 3/3] net: stmmac: skip queueMaxSDU check for AF_XDP
2026-08-10 18:47 [PATCH net-next 0/3] xsk: pre-existing AF_XDP TX metadata fixes from Sashiko Stanislav Fomichev
2026-08-10 18:47 ` [PATCH net-next 1/3] xsk: align TX metadata layout across ABIs Stanislav Fomichev
2026-08-10 18:47 ` [PATCH net-next 2/3] xsk: honor XDP_TX_METADATA in zero-copy path Stanislav Fomichev
@ 2026-08-10 18:47 ` Stanislav Fomichev
2026-08-10 18:52 ` [PATCH net-next 0/3] xsk: pre-existing AF_XDP TX metadata fixes from Sashiko Stanislav Fomichev
3 siblings, 0 replies; 6+ messages in thread
From: Stanislav Fomichev @ 2026-08-10 18:47 UTC (permalink / raw)
To: netdev
Cc: davem, edumazet, kuba, pabeni, anthony.l.nguyen,
przemyslaw.kitszel, andrew+netdev, saeedm, tariqt, mbloch,
maxime.chevallier, mcoquelin.stm32, alexandre.torgue,
aleksander.lobakin, horms, magnus.karlsson, maciej.fijalkowski,
sdf, ast, daniel, hawk, john.fastabend, alice.kernel, dtatulea,
witu, martin.lau, yoong.siang.song, rohan.g.thomas,
intel-wired-lan, linux-kernel, linux-rdma, linux-stm32,
linux-arm-kernel, bpf, leon
Commit c5c3e1bfc9e0 ("net: stmmac: Offload queueMaxSDU from tc-taprio")
was inspired by commit 92a0dcb8427d ("igc: offload queue max SDU from
tc-taprio"), but the igc change does not apply the check to AF_XDP.
xsk_tx_peek_desc() reserves a completion entry. Continuing without
queuing or completing the descriptor leaves the AF_XDP rings imbalanced,
so remove the check from the zero-copy path.
Fixes: c5c3e1bfc9e0 ("net: stmmac: Offload queueMaxSDU from tc-taprio")
Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
---
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index efa35cfecc4f..6e9d4cb336ee 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2714,13 +2714,6 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
if (!xsk_tx_peek_desc(pool, &xdp_desc))
break;
- if (priv->est && priv->est->enable &&
- priv->est->max_sdu[queue] &&
- xdp_desc.len > priv->est->max_sdu[queue]) {
- priv->xstats.max_sdu_txq_drop[queue]++;
- continue;
- }
-
tx_desc = stmmac_get_tx_desc(priv, tx_q, entry);
dma_addr = xsk_buff_raw_get_dma(pool, xdp_desc.addr);
meta = xsk_buff_get_metadata(pool, xdp_desc.addr,
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH net-next 0/3] xsk: pre-existing AF_XDP TX metadata fixes from Sashiko
2026-08-10 18:47 [PATCH net-next 0/3] xsk: pre-existing AF_XDP TX metadata fixes from Sashiko Stanislav Fomichev
` (2 preceding siblings ...)
2026-08-10 18:47 ` [PATCH net-next 3/3] net: stmmac: skip queueMaxSDU check for AF_XDP Stanislav Fomichev
@ 2026-08-10 18:52 ` Stanislav Fomichev
2026-08-10 19:40 ` Jakub Kicinski
3 siblings, 1 reply; 6+ messages in thread
From: Stanislav Fomichev @ 2026-08-10 18:52 UTC (permalink / raw)
To: netdev
Cc: davem, edumazet, kuba, pabeni, anthony.l.nguyen,
przemyslaw.kitszel, andrew+netdev, saeedm, tariqt, mbloch,
maxime.chevallier, mcoquelin.stm32, alexandre.torgue,
aleksander.lobakin, horms, magnus.karlsson, maciej.fijalkowski,
sdf, ast, daniel, hawk, john.fastabend, alice.kernel, dtatulea,
witu, martin.lau, yoong.siang.song, rohan.g.thomas,
intel-wired-lan, linux-kernel, linux-rdma, linux-stm32,
linux-arm-kernel, bpf, leon
On 08/10, Stanislav Fomichev wrote:
> A few fixes to address pre-existing issues from Sashiko review.
>
> Stanislav Fomichev (3):
> xsk: align TX metadata layout across ABIs
> xsk: honor XDP_TX_METADATA in zero-copy path
> net: stmmac: skip queueMaxSDU check for AF_XDP
Ooops, this should've been targeted to net tree. Will resend in a few
days in case there is any review feedback.
---
pw-bot: cr
^ permalink raw reply [flat|nested] 6+ messages in thread