[Intel-wired-lan] [net v7] i40e: Fix DMA mappings leak
G, GurucharanX
gurucharanx.g at intel.com
Wed Oct 12 08:04:17 UTC 2022
> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces at osuosl.org> On Behalf Of
> Jacob Keller
> Sent: Wednesday, October 12, 2022 12:49 AM
> To: Intel Wired LAN <intel-wired-lan at lists.osuosl.org>
> Cc: Rout, ChandanX <chandanx.rout at intel.com>
> Subject: [Intel-wired-lan] [net v7] i40e: Fix DMA mappings leak
>
> From: Jan Sokolowski <jan.sokolowski at intel.com>
>
> During reallocation of RX buffers, new DMA mappings are created for those
> buffers.
>
> steps for reproduction:
> while :
> do
> for ((i=0; i<=8160; i=i+32))
> do
> ethtool -G enp130s0f0 rx $i tx $i
> sleep 0.5
> ethtool -g enp130s0f0
> done
> done
>
> This resulted in crash:
> i40e 0000:01:00.1: Unable to allocate memory for the Rx descriptor ring,
> size=65536 Driver BUG
> WARNING: CPU: 0 PID: 4300 at net/core/xdp.c:141
> xdp_rxq_info_unreg+0x43/0x50 Call Trace:
> i40e_free_rx_resources+0x70/0x80 [i40e]
> i40e_set_ringparam+0x27c/0x800 [i40e]
> ethnl_set_rings+0x1b2/0x290
> genl_family_rcv_msg_doit.isra.15+0x10f/0x150
> genl_family_rcv_msg+0xb3/0x160
> ? rings_fill_reply+0x1a0/0x1a0
> genl_rcv_msg+0x47/0x90
> ? genl_family_rcv_msg+0x160/0x160
> netlink_rcv_skb+0x4c/0x120
> genl_rcv+0x24/0x40
> netlink_unicast+0x196/0x230
> netlink_sendmsg+0x204/0x3d0
> sock_sendmsg+0x4c/0x50
> __sys_sendto+0xee/0x160
> ? handle_mm_fault+0xbe/0x1e0
> ? syscall_trace_enter+0x1d3/0x2c0
> __x64_sys_sendto+0x24/0x30
> do_syscall_64+0x5b/0x1a0
> entry_SYSCALL_64_after_hwframe+0x65/0xca
> RIP: 0033:0x7f5eac8b035b
> Missing register, driver bug
> WARNING: CPU: 0 PID: 4300 at net/core/xdp.c:119
> xdp_rxq_info_unreg_mem_model+0x69/0x140
> Call Trace:
> xdp_rxq_info_unreg+0x1e/0x50
> i40e_free_rx_resources+0x70/0x80 [i40e]
> i40e_set_ringparam+0x27c/0x800 [i40e]
> ethnl_set_rings+0x1b2/0x290
> genl_family_rcv_msg_doit.isra.15+0x10f/0x150
> genl_family_rcv_msg+0xb3/0x160
> ? rings_fill_reply+0x1a0/0x1a0
> genl_rcv_msg+0x47/0x90
> ? genl_family_rcv_msg+0x160/0x160
> netlink_rcv_skb+0x4c/0x120
> genl_rcv+0x24/0x40
> netlink_unicast+0x196/0x230
> netlink_sendmsg+0x204/0x3d0
> sock_sendmsg+0x4c/0x50
> __sys_sendto+0xee/0x160
> ? handle_mm_fault+0xbe/0x1e0
> ? syscall_trace_enter+0x1d3/0x2c0
> __x64_sys_sendto+0x24/0x30
> do_syscall_64+0x5b/0x1a0
> entry_SYSCALL_64_after_hwframe+0x65/0xca
> RIP: 0033:0x7f5eac8b035b
>
> This was caused because of new buffers with different RX ring count should
> substitute older ones, but those buffers were freed in
> i40e_configure_rx_ring and reallocated again with i40e_alloc_rx_bi, thus
> kfree on rx_bi caused leak of already mapped DMA.
>
> Fix this by reallocating ZC with rx_bi_zc struct when BPF program loads.
> Additionally reallocate back to rx_bi when BPF program unloads.
>
> If BPF program is loaded/unloaded and XSK pools are created, reallocate RX
> queues accordingly in XSP_SETUP_XSK_POOL handler.
>
> Fixes: be1222b585fd ("i40e: Separate kernel allocated rx_bi rings from
> AF_XDP rings")
> Signed-off-by: Jan Sokolowski <jan.sokolowski at intel.com>
> Signed-off-by: Mateusz Palczewski <mateusz.palczewski at intel.com>
> Signed-off-by: Jacob Keller <jacob.e.keller at intel.com>
> Tested-by: Chandan <chandanx.rout at intel.com> (A Contingent Worker at
> Intel)
> ---
> I fixed the -Wdangling-else warning.
>
> .../net/ethernet/intel/i40e/i40e_ethtool.c | 3 -
> drivers/net/ethernet/intel/i40e/i40e_main.c | 16 +++--
> drivers/net/ethernet/intel/i40e/i40e_txrx.c | 13 ++--
> drivers/net/ethernet/intel/i40e/i40e_txrx.h | 1 -
> drivers/net/ethernet/intel/i40e/i40e_xsk.c | 67 ++++++++++++++++---
> drivers/net/ethernet/intel/i40e/i40e_xsk.h | 2 +-
> 6 files changed, 74 insertions(+), 28 deletions(-)
>
Tested-by: Gurucharan <gurucharanx.g at intel.com> (A Contingent worker at Intel)
More information about the Intel-wired-lan
mailing list