mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 14:05:46 +07:00
6a146f3a58
Since the introduction of ULD (Upper-Layer Drivers), the MSI-X
deallocating path changed in cxgb4: the driver frees the interrupts
of ULD when unregistering it or on shutdown PCI handler.
Problem is that if a MSI-X is not freed before deallocated in the PCI
layer, it will trigger a BUG() due to still "alive" interrupt being
tentatively quiesced.
The below trace was observed when doing a simple unbind of Chelsio's
adapter PCI function, like:
"echo 001e:80:00.4 > /sys/bus/pci/drivers/cxgb4/unbind"
Trace:
kernel BUG at drivers/pci/msi.c:352!
Oops: Exception in kernel mode, sig: 5 [#1]
...
NIP [c0000000005a5e60] free_msi_irqs+0xa0/0x250
LR [c0000000005a5e50] free_msi_irqs+0x90/0x250
Call Trace:
[c0000000005a5e50] free_msi_irqs+0x90/0x250 (unreliable)
[c0000000005a72c4] pci_disable_msix+0x124/0x180
[d000000011e06708] disable_msi+0x88/0xb0 [cxgb4]
[d000000011e06948] free_some_resources+0xa8/0x160 [cxgb4]
[d000000011e06d60] remove_one+0x170/0x3c0 [cxgb4]
[c00000000058a910] pci_device_remove+0x70/0x110
[c00000000064ef04] device_release_driver_internal+0x1f4/0x2c0
...
This patch fixes the issue by refactoring the shutdown path of ULD on
cxgb4 driver, by properly freeing and disabling interrupts on PCI
remove handler too.
Fixes:
|
||
---|---|---|
.. | ||
clip_tbl.c | ||
clip_tbl.h | ||
cxgb4_dcb.c | ||
cxgb4_dcb.h | ||
cxgb4_debugfs.c | ||
cxgb4_debugfs.h | ||
cxgb4_ethtool.c | ||
cxgb4_fcoe.c | ||
cxgb4_fcoe.h | ||
cxgb4_filter.c | ||
cxgb4_filter.h | ||
cxgb4_main.c | ||
cxgb4_ptp.c | ||
cxgb4_ptp.h | ||
cxgb4_tc_u32_parse.h | ||
cxgb4_tc_u32.c | ||
cxgb4_tc_u32.h | ||
cxgb4_uld.c | ||
cxgb4_uld.h | ||
cxgb4.h | ||
l2t.c | ||
l2t.h | ||
Makefile | ||
sched.c | ||
sched.h | ||
sge.c | ||
t4_chip_type.h | ||
t4_hw.c | ||
t4_hw.h | ||
t4_msg.h | ||
t4_pci_id_tbl.h | ||
t4_regs.h | ||
t4_values.h | ||
t4fw_api.h | ||
t4fw_version.h |