| From 534e409f76cddef6e9ad185e1b9eccb645c000d8 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?=C3=8D=C3=B1igo=20Huguet?= <ihuguet@redhat.com> |
| Date: Wed, 13 Jul 2022 11:21:16 +0200 |
| Subject: [PATCH 13/28] sfc: fix kernel panic when creating VF |
| Git-commit: ada74c5539eba06cf8b47d068f92e0b3963a9a6e |
| Patch-mainline: v5.19-rc7 |
| References: git-fixes |
| |
| When creating VFs a kernel panic can happen when calling to |
| efx_ef10_try_update_nic_stats_vf. |
| |
| When releasing a DMA coherent buffer, sometimes, I don't know in what |
| specific circumstances, it has to unmap memory with vunmap. It is |
| disallowed to do that in IRQ context or with BH disabled. Otherwise, we |
| hit this line in vunmap, causing the crash: |
| BUG_ON(in_interrupt()); |
| |
| This patch reenables BH to release the buffer. |
| |
| Log messages when the bug is hit: |
| kernel BUG at mm/vmalloc.c:2727! |
| invalid opcode: 0000 [#1] PREEMPT SMP NOPTI |
| CPU: 6 PID: 1462 Comm: NetworkManager Kdump: loaded Tainted: G I --------- --- 5.14.0-119.el9.x86_64 #1 |
| Hardware name: Dell Inc. PowerEdge R740/06WXJT, BIOS 2.8.2 08/27/2020 |
| RIP: 0010:vunmap+0x2e/0x30 |
| ...skip... |
| Call Trace: |
| __iommu_dma_free+0x96/0x100 |
| efx_nic_free_buffer+0x2b/0x40 [sfc] |
| efx_ef10_try_update_nic_stats_vf+0x14a/0x1c0 [sfc] |
| efx_ef10_update_stats_vf+0x18/0x40 [sfc] |
| efx_start_all+0x15e/0x1d0 [sfc] |
| efx_net_open+0x5a/0xe0 [sfc] |
| __dev_open+0xe7/0x1a0 |
| __dev_change_flags+0x1d7/0x240 |
| dev_change_flags+0x21/0x60 |
| ...skip... |
| |
| Fixes: d778819609a2 ("sfc: DMA the VF stats only when requested") |
| Reported-by: Ma Yuying <yuma@redhat.com> |
| Signed-off-by: Íñigo Huguet <ihuguet@redhat.com> |
| Acked-by: Edward Cree <ecree.xilinx@gmail.com> |
| Link: https://lore.kernel.org/r/20220713092116.21238-1-ihuguet@redhat.com |
| Signed-off-by: Paolo Abeni <pabeni@redhat.com> |
| Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com> |
| |
| drivers/net/ethernet/sfc/ef10.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c |
| index f5a4d8f4fd11..8b5c2f24612a 100644 |
| |
| |
| @@ -1932,7 +1932,10 @@ static int efx_ef10_try_update_nic_stats_vf(struct efx_nic *efx) |
| |
| efx_update_sw_stats(efx, stats); |
| out: |
| + /* releasing a DMA coherent buffer with BH disabled can panic */ |
| + spin_unlock_bh(&efx->stats_lock); |
| efx_nic_free_buffer(efx, &stats_buf); |
| + spin_lock_bh(&efx->stats_lock); |
| return rc; |
| } |
| |
| -- |
| 2.16.4 |
| |