Skip to content

Commit 3714e0b

Browse files
Shahjada Abul Husaingregkh
authored andcommitted
cxgb4: fix IRQ free race during driver unload
[ Upstream commit 015fe6f ] IRQs are requested during driver's ndo_open() and then later freed up in disable_interrupts() during driver unload. A race exists where driver can set the CXGB4_FULL_INIT_DONE flag in ndo_open() after the disable_interrupts() in driver unload path checks it, and hence misses calling free_irq(). Fix by unregistering netdevice first and sync with driver's ndo_open(). This ensures disable_interrupts() checks the flag correctly and frees up the IRQs properly. Fixes: b37987e ("cxgb4: Disable interrupts and napi before unregistering netdev") Signed-off-by: Shahjada Abul Husain <shahjada@chelsio.com> Signed-off-by: Raju Rangoju <rajur@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent d92337b commit 3714e0b

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2643,6 +2643,9 @@ static void detach_ulds(struct adapter *adap)
26432643
{
26442644
unsigned int i;
26452645

2646+
if (!is_uld(adap))
2647+
return;
2648+
26462649
mutex_lock(&uld_mutex);
26472650
list_del(&adap->list_node);
26482651

@@ -7145,21 +7148,20 @@ static void remove_one(struct pci_dev *pdev)
71457148
*/
71467149
destroy_workqueue(adapter->workq);
71477150

7148-
if (is_uld(adapter)) {
7149-
detach_ulds(adapter);
7150-
t4_uld_clean_up(adapter);
7151-
}
7151+
detach_ulds(adapter);
7152+
7153+
for_each_port(adapter, i)
7154+
if (adapter->port[i]->reg_state == NETREG_REGISTERED)
7155+
unregister_netdev(adapter->port[i]);
7156+
7157+
t4_uld_clean_up(adapter);
71527158

71537159
adap_free_hma_mem(adapter);
71547160

71557161
disable_interrupts(adapter);
71567162

71577163
cxgb4_free_mps_ref_entries(adapter);
71587164

7159-
for_each_port(adapter, i)
7160-
if (adapter->port[i]->reg_state == NETREG_REGISTERED)
7161-
unregister_netdev(adapter->port[i]);
7162-
71637165
debugfs_remove_recursive(adapter->debugfs_root);
71647166

71657167
if (!is_t4(adapter->params.chip))

drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,9 @@ void t4_uld_clean_up(struct adapter *adap)
581581
{
582582
unsigned int i;
583583

584+
if (!is_uld(adap))
585+
return;
586+
584587
mutex_lock(&uld_mutex);
585588
for (i = 0; i < CXGB4_ULD_MAX; i++) {
586589
if (!adap->uld[i].handle)

0 commit comments

Comments
 (0)