Patch "net/mlx5e: xsk: Fix invalid buffer access for legacy rq" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net/mlx5e: xsk: Fix invalid buffer access for legacy rq

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-mlx5e-xsk-fix-invalid-buffer-access-for-legacy-r.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 783e21913110f53f7eed284129fc176b05e7bc88
Author: Dragos Tatulea <dtatulea@xxxxxxxxxx>
Date:   Tue Jul 18 11:13:33 2023 +0300

    net/mlx5e: xsk: Fix invalid buffer access for legacy rq
    
    [ Upstream commit e0f52298fee449fec37e3e3c32df60008b509b16 ]
    
    The below crash can be encountered when using xdpsock in rx mode for
    legacy rq: the buffer gets released in the XDP_REDIRECT path, and then
    once again in the driver. This fix sets the flag to avoid releasing on
    the driver side.
    
    XSK handling of buffers for legacy rq was relying on the caller to set
    the skip release flag. But the referenced fix started using fragment
    counts for pages instead of the skip flag.
    
    Crash log:
     general protection fault, probably for non-canonical address 0xffff8881217e3a: 0000 [#1] SMP
     CPU: 0 PID: 14 Comm: ksoftirqd/0 Not tainted 6.5.0-rc1+ #31
     Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
     RIP: 0010:bpf_prog_03b13f331978c78c+0xf/0x28
     Code:  ...
     RSP: 0018:ffff88810082fc98 EFLAGS: 00010246
     RAX: 0000000000000000 RBX: ffff888138404901 RCX: c0ffffc900027cbc
     RDX: ffffffffa000b514 RSI: 00ffff8881217e32 RDI: ffff888138404901
     RBP: ffff88810082fc98 R08: 0000000000091100 R09: 0000000000000006
     R10: 0000000000000800 R11: 0000000000000800 R12: ffffc9000027a000
     R13: ffff8881217e2dc0 R14: ffff8881217e2910 R15: ffff8881217e2f00
     FS:  0000000000000000(0000) GS:ffff88852c800000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 0000564cb2e2cde0 CR3: 000000010e603004 CR4: 0000000000370eb0
     DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
     DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
     Call Trace:
      <TASK>
      ? die_addr+0x32/0x80
      ? exc_general_protection+0x192/0x390
      ? asm_exc_general_protection+0x22/0x30
      ? 0xffffffffa000b514
      ? bpf_prog_03b13f331978c78c+0xf/0x28
      mlx5e_xdp_handle+0x48/0x670 [mlx5_core]
      ? dev_gro_receive+0x3b5/0x6e0
      mlx5e_xsk_skb_from_cqe_linear+0x6e/0x90 [mlx5_core]
      mlx5e_handle_rx_cqe+0x55/0x100 [mlx5_core]
      mlx5e_poll_rx_cq+0x87/0x6e0 [mlx5_core]
      mlx5e_napi_poll+0x45e/0x6b0 [mlx5_core]
      __napi_poll+0x25/0x1a0
      net_rx_action+0x28a/0x300
      __do_softirq+0xcd/0x279
      ? sort_range+0x20/0x20
      run_ksoftirqd+0x1a/0x20
      smpboot_thread_fn+0xa2/0x130
      kthread+0xc9/0xf0
      ? kthread_complete_and_exit+0x20/0x20
      ret_from_fork+0x1f/0x30
      </TASK>
     Modules linked in: mlx5_ib mlx5_core rpcrdma rdma_ucm ib_iser libiscsi scsi_transport_iscsi ib_umad rdma_cm ib_ipoib iw_cm ib_cm ib_uverbs ib_core xt_conntrack xt_MASQUERADE nf_conntrack_netlink nfnetlink xt_addrtype iptable_nat nf_nat br_netfilter overlay zram zsmalloc fuse [last unloaded: mlx5_core]
     ---[ end trace 0000000000000000 ]---
    
    Fixes: 7abd955a58fb ("net/mlx5e: RX, Fix page_pool page fragment tracking for XDP")
    Signed-off-by: Dragos Tatulea <dtatulea@xxxxxxxxxx>
    Reviewed-by: Tariq Toukan <tariqt@xxxxxxxxxx>
    Signed-off-by: Saeed Mahameed <saeedm@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c
index d97e6df66f454..b8dd744536553 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c
@@ -323,8 +323,11 @@ struct sk_buff *mlx5e_xsk_skb_from_cqe_linear(struct mlx5e_rq *rq,
 	net_prefetch(mxbuf->xdp.data);
 
 	prog = rcu_dereference(rq->xdp_prog);
-	if (likely(prog && mlx5e_xdp_handle(rq, prog, mxbuf)))
+	if (likely(prog && mlx5e_xdp_handle(rq, prog, mxbuf))) {
+		if (likely(__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)))
+			wi->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE);
 		return NULL; /* page/packet was consumed by XDP */
+	}
 
 	/* XDP_PASS: copy the data from the UMEM to a new SKB. The frame reuse
 	 * will be handled by mlx5e_free_rx_wqe.



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux