Message ID | 20220713092116.21238-1-ihuguet@redhat.com (mailing list archive) |
---|---|
State | Accepted |
Commit | ada74c5539eba06cf8b47d068f92e0b3963a9a6e |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] sfc: fix kernel panic when creating VF | expand |
On 13/07/2022 10:21, Íñigo Huguet wrote: ...> 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> Really the whole locking thing around stats is ugly and we ought to redesign it so as to fix things properly (AFAICT there's no reason why the stats_lock needs to be taken by the caller rather than within the nic_type->update_stats() method), but for the time being this looks like the right minimal fix for 'net'. -ed
Hello: This patch was applied to netdev/net.git (master) by Paolo Abeni <pabeni@redhat.com>: On Wed, 13 Jul 2022 11:21:16 +0200 you wrote: > 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()); > > [...] Here is the summary with links: - [net] sfc: fix kernel panic when creating VF https://git.kernel.org/netdev/net/c/ada74c5539eb You are awesome, thank you!
diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c index 186cb28c03bd..8b62ce21aff3 100644 --- a/drivers/net/ethernet/sfc/ef10.c +++ b/drivers/net/ethernet/sfc/ef10.c @@ -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; }
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> --- drivers/net/ethernet/sfc/ef10.c | 3 +++ 1 file changed, 3 insertions(+)