Skip to content

Commit 5414f27

Browse files
Francesco Ruggerigregkh
authored andcommitted
igb: reinit_locked() should be called with rtnl_lock
[ Upstream commit 024a816 ] We observed two panics involving races with igb_reset_task. The first panic is caused by this race condition: kworker reboot -f igb_reset_task igb_reinit_locked igb_down napi_synchronize __igb_shutdown igb_clear_interrupt_scheme igb_free_q_vectors igb_free_q_vector adapter->q_vector[v_idx] = NULL; napi_disable Panics trying to access adapter->q_vector[v_idx].napi_state The second panic (a divide error) is caused by this race: kworker reboot -f tx packet igb_reset_task __igb_shutdown rtnl_lock() ... igb_clear_interrupt_scheme igb_free_q_vectors adapter->num_tx_queues = 0 ... rtnl_unlock() rtnl_lock() igb_reinit_locked igb_down igb_up netif_tx_start_all_queues dev_hard_start_xmit igb_xmit_frame igb_tx_queue_mapping Panics on r_idx % adapter->num_tx_queues This commit applies to igb_reset_task the same changes that were applied to ixgbe in commit 2f90b86 ("ixgbe: this patch adds support for DCB to the kernel and ixgbe driver"), commit 8f4c5c9 ("ixgbe: reinit_locked() should be called with rtnl_lock") and commit 88adce4 ("ixgbe: fix possible race in reset subtask"). Signed-off-by: Francesco Ruggeri <[email protected]> Tested-by: Aaron Brown <[email protected]> Signed-off-by: Tony Nguyen <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 7c8a863 commit 5414f27

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

drivers/net/ethernet/intel/igb/igb_main.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6194,9 +6194,18 @@ static void igb_reset_task(struct work_struct *work)
61946194
struct igb_adapter *adapter;
61956195
adapter = container_of(work, struct igb_adapter, reset_task);
61966196

6197+
rtnl_lock();
6198+
/* If we're already down or resetting, just bail */
6199+
if (test_bit(__IGB_DOWN, &adapter->state) ||
6200+
test_bit(__IGB_RESETTING, &adapter->state)) {
6201+
rtnl_unlock();
6202+
return;
6203+
}
6204+
61976205
igb_dump(adapter);
61986206
netdev_err(adapter->netdev, "Reset adapter\n");
61996207
igb_reinit_locked(adapter);
6208+
rtnl_unlock();
62006209
}
62016210

62026211
/**

0 commit comments

Comments
 (0)