linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5
@ 2025-10-16 19:55 Tariq Toukan
  2025-10-16 19:55 ` [PATCH net V3 1/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy RQ Tariq Toukan
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Tariq Toukan @ 2025-10-16 19:55 UTC (permalink / raw)
  To: Eric Dumazet, Jakub Kicinski, Paolo Abeni, Andrew Lunn,
	David S. Miller
  Cc: Saeed Mahameed, Tariq Toukan, Mark Bloch, Leon Romanovsky,
	Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
	John Fastabend, netdev, linux-rdma, linux-kernel, bpf,
	Gal Pressman, Moshe Shemesh, Dragos Tatulea, Amery Hung,
	martin.lau, noren, cpaasch, kernel-team

v3
 - checkpatch fixes

v2
 - Simplify truesize calculation (Tariq)
 - Narrow the scope of local variables (Tariq)
 - Make truesize adjustment conditional (Tariq)

Link: https://lore.kernel.org/all/20250915225857.3024997-1-ameryhung@gmail.com/

v1
 - Separate the set from [0] (Dragos)
 - Split legacy RQ and striding RQ fixes (Dragos)
 - Drop conditional truesize and end frag ptr update (Dragos)
 - Fix truesize calculation in striding RQ (Dragos)
 - Fix the always zero headlen passed to __pskb_pull_tail() that
   causes kernel panic (Nimrod)

Link: https://lore.kernel.org/bpf/20250910034103.650342-1-ameryhung@gmail.com/


Amery Hung (2):
  net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy
    RQ
  net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for
    striding RQ

 .../net/ethernet/mellanox/mlx5/core/en_rx.c   | 51 +++++++++++++++----
 1 file changed, 42 insertions(+), 9 deletions(-)


base-commit: 634ec1fc7982efeeeeed4a7688b0004827b43a21
-- 
2.31.1


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

* [PATCH net V3 1/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy RQ
  2025-10-16 19:55 [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5 Tariq Toukan
@ 2025-10-16 19:55 ` Tariq Toukan
  2025-10-16 19:55 ` [PATCH net V3 2/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for striding RQ Tariq Toukan
  2025-10-21  0:50 ` [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5 patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: Tariq Toukan @ 2025-10-16 19:55 UTC (permalink / raw)
  To: Eric Dumazet, Jakub Kicinski, Paolo Abeni, Andrew Lunn,
	David S. Miller
  Cc: Saeed Mahameed, Tariq Toukan, Mark Bloch, Leon Romanovsky,
	Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
	John Fastabend, netdev, linux-rdma, linux-kernel, bpf,
	Gal Pressman, Moshe Shemesh, Dragos Tatulea, Amery Hung,
	martin.lau, noren, cpaasch, kernel-team

From: Amery Hung <ameryhung@gmail.com>

XDP programs can release xdp_buff fragments when calling
bpf_xdp_adjust_tail(). The driver currently assumes the number of
fragments to be unchanged and may generate skb with wrong truesize or
containing invalid frags. Fix the bug by generating skb according to
xdp_buff after the XDP program runs.

Fixes: ea5d49bdae8b ("net/mlx5e: Add XDP multi buffer support to the non-linear legacy RQ")
Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
Signed-off-by: Amery Hung <ameryhung@gmail.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
---
 .../net/ethernet/mellanox/mlx5/core/en_rx.c   | 25 ++++++++++++++-----
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index 263d5628ee44..17cab14b328b 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -1794,14 +1794,27 @@ mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi
 	}
 
 	prog = rcu_dereference(rq->xdp_prog);
-	if (prog && mlx5e_xdp_handle(rq, prog, mxbuf)) {
-		if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
-			struct mlx5e_wqe_frag_info *pwi;
+	if (prog) {
+		u8 nr_frags_free, old_nr_frags = sinfo->nr_frags;
+
+		if (mlx5e_xdp_handle(rq, prog, mxbuf)) {
+			if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT,
+						 rq->flags)) {
+				struct mlx5e_wqe_frag_info *pwi;
+
+				wi -= old_nr_frags - sinfo->nr_frags;
+
+				for (pwi = head_wi; pwi < wi; pwi++)
+					pwi->frag_page->frags++;
+			}
+			return NULL; /* page/packet was consumed by XDP */
+		}
 
-			for (pwi = head_wi; pwi < wi; pwi++)
-				pwi->frag_page->frags++;
+		nr_frags_free = old_nr_frags - sinfo->nr_frags;
+		if (unlikely(nr_frags_free)) {
+			wi -= nr_frags_free;
+			truesize -= nr_frags_free * frag_info->frag_stride;
 		}
-		return NULL; /* page/packet was consumed by XDP */
 	}
 
 	skb = mlx5e_build_linear_skb(
-- 
2.31.1


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

* [PATCH net V3 2/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for striding RQ
  2025-10-16 19:55 [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5 Tariq Toukan
  2025-10-16 19:55 ` [PATCH net V3 1/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy RQ Tariq Toukan
@ 2025-10-16 19:55 ` Tariq Toukan
  2025-10-21  0:50 ` [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5 patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: Tariq Toukan @ 2025-10-16 19:55 UTC (permalink / raw)
  To: Eric Dumazet, Jakub Kicinski, Paolo Abeni, Andrew Lunn,
	David S. Miller
  Cc: Saeed Mahameed, Tariq Toukan, Mark Bloch, Leon Romanovsky,
	Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
	John Fastabend, netdev, linux-rdma, linux-kernel, bpf,
	Gal Pressman, Moshe Shemesh, Dragos Tatulea, Amery Hung,
	martin.lau, noren, cpaasch, kernel-team

From: Amery Hung <ameryhung@gmail.com>

XDP programs can change the layout of an xdp_buff through
bpf_xdp_adjust_tail() and bpf_xdp_adjust_head(). Therefore, the driver
cannot assume the size of the linear data area nor fragments. Fix the
bug in mlx5 by generating skb according to xdp_buff after XDP programs
run.

Currently, when handling multi-buf XDP, the mlx5 driver assumes the
layout of an xdp_buff to be unchanged. That is, the linear data area
continues to be empty and fragments remain the same. This may cause
the driver to generate erroneous skb or triggering a kernel
warning. When an XDP program added linear data through
bpf_xdp_adjust_head(), the linear data will be ignored as
mlx5e_build_linear_skb() builds an skb without linear data and then
pull data from fragments to fill the linear data area. When an XDP
program has shrunk the non-linear data through bpf_xdp_adjust_tail(),
the delta passed to __pskb_pull_tail() may exceed the actual nonlinear
data size and trigger the BUG_ON in it.

To fix the issue, first record the original number of fragments. If the
number of fragments changes after the XDP program runs, rewind the end
fragment pointer by the difference and recalculate the truesize. Then,
build the skb with the linear data area matching the xdp_buff. Finally,
only pull data in if there is non-linear data and fill the linear part
up to 256 bytes.

Fixes: f52ac7028bec ("net/mlx5e: RX, Add XDP multi-buffer support in Striding RQ")
Signed-off-by: Amery Hung <ameryhung@gmail.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
---
 .../net/ethernet/mellanox/mlx5/core/en_rx.c   | 26 ++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index 17cab14b328b..1c79adc51a04 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -2040,6 +2040,7 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
 	u32 byte_cnt       = cqe_bcnt;
 	struct skb_shared_info *sinfo;
 	unsigned int truesize = 0;
+	u32 pg_consumed_bytes;
 	struct bpf_prog *prog;
 	struct sk_buff *skb;
 	u32 linear_frame_sz;
@@ -2093,7 +2094,8 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
 
 	while (byte_cnt) {
 		/* Non-linear mode, hence non-XSK, which always uses PAGE_SIZE. */
-		u32 pg_consumed_bytes = min_t(u32, PAGE_SIZE - frag_offset, byte_cnt);
+		pg_consumed_bytes =
+			min_t(u32, PAGE_SIZE - frag_offset, byte_cnt);
 
 		if (test_bit(MLX5E_RQ_STATE_SHAMPO, &rq->state))
 			truesize += pg_consumed_bytes;
@@ -2109,10 +2111,15 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
 	}
 
 	if (prog) {
+		u8 nr_frags_free, old_nr_frags = sinfo->nr_frags;
+		u32 len;
+
 		if (mlx5e_xdp_handle(rq, prog, mxbuf)) {
 			if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
 				struct mlx5e_frag_page *pfp;
 
+				frag_page -= old_nr_frags - sinfo->nr_frags;
+
 				for (pfp = head_page; pfp < frag_page; pfp++)
 					pfp->frags++;
 
@@ -2123,9 +2130,19 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
 			return NULL; /* page/packet was consumed by XDP */
 		}
 
+		nr_frags_free = old_nr_frags - sinfo->nr_frags;
+		if (unlikely(nr_frags_free)) {
+			frag_page -= nr_frags_free;
+			truesize -= (nr_frags_free - 1) * PAGE_SIZE +
+				ALIGN(pg_consumed_bytes,
+				      BIT(rq->mpwqe.log_stride_sz));
+		}
+
+		len = mxbuf->xdp.data_end - mxbuf->xdp.data;
+
 		skb = mlx5e_build_linear_skb(
 			rq, mxbuf->xdp.data_hard_start, linear_frame_sz,
-			mxbuf->xdp.data - mxbuf->xdp.data_hard_start, 0,
+			mxbuf->xdp.data - mxbuf->xdp.data_hard_start, len,
 			mxbuf->xdp.data - mxbuf->xdp.data_meta);
 		if (unlikely(!skb)) {
 			mlx5e_page_release_fragmented(rq->page_pool,
@@ -2150,8 +2167,11 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
 			do
 				pagep->frags++;
 			while (++pagep < frag_page);
+
+			headlen = min_t(u16, MLX5E_RX_MAX_HEAD - len,
+					skb->data_len);
+			__pskb_pull_tail(skb, headlen);
 		}
-		__pskb_pull_tail(skb, headlen);
 	} else {
 		dma_addr_t addr;
 
-- 
2.31.1


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

* Re: [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5
  2025-10-16 19:55 [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5 Tariq Toukan
  2025-10-16 19:55 ` [PATCH net V3 1/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy RQ Tariq Toukan
  2025-10-16 19:55 ` [PATCH net V3 2/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for striding RQ Tariq Toukan
@ 2025-10-21  0:50 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-10-21  0:50 UTC (permalink / raw)
  To: Tariq Toukan
  Cc: edumazet, kuba, pabeni, andrew+netdev, davem, saeedm, mbloch,
	leon, ast, daniel, hawk, john.fastabend, netdev, linux-rdma,
	linux-kernel, bpf, gal, moshe, dtatulea, ameryhung, martin.lau,
	noren, cpaasch, kernel-team

Hello:

This series was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Thu, 16 Oct 2025 22:55:38 +0300 you wrote:
> v3
>  - checkpatch fixes
> 
> v2
>  - Simplify truesize calculation (Tariq)
>  - Narrow the scope of local variables (Tariq)
>  - Make truesize adjustment conditional (Tariq)
> 
> [...]

Here is the summary with links:
  - [net,V3,1/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy RQ
    https://git.kernel.org/netdev/net/c/afd5ba577c10
  - [net,V3,2/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for striding RQ
    https://git.kernel.org/netdev/net/c/87bcef158ac1

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



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

end of thread, other threads:[~2025-10-21  0:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-16 19:55 [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5 Tariq Toukan
2025-10-16 19:55 ` [PATCH net V3 1/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy RQ Tariq Toukan
2025-10-16 19:55 ` [PATCH net V3 2/2] net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for striding RQ Tariq Toukan
2025-10-21  0:50 ` [PATCH net V3 0/2] Fix generating skb from non-linear xdp_buff for mlx5 patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).