aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Nguyen <anthony.l.nguyen@intel.com>2018-05-30 12:05:12 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2018-06-04 13:25:15 -0400
commit88adce4ea8f96b5191df2bea76905814cc3814e2 (patch)
treeedc6117dc98d990a01043d6a501d65078eb51b67
parentcc5b114dcf986bfd8e4c37bf65d1b7b1e5290ac6 (diff)
ixgbe: fix possible race in reset subtask
Similar to ixgbevf, the same possibility for race exists. Extend the RTNL lock in ixgbe_reset_subtask() to protect the state bits; this is to make sure that we get the most up-to-date values for the bits and avoid a possible race when going down. Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index ba3035c08572..dd8a3a037c2f 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -7621,17 +7621,19 @@ static void ixgbe_reset_subtask(struct ixgbe_adapter *adapter)
7621 if (!test_and_clear_bit(__IXGBE_RESET_REQUESTED, &adapter->state)) 7621 if (!test_and_clear_bit(__IXGBE_RESET_REQUESTED, &adapter->state))
7622 return; 7622 return;
7623 7623
7624 rtnl_lock();
7624 /* If we're already down, removing or resetting, just bail */ 7625 /* If we're already down, removing or resetting, just bail */
7625 if (test_bit(__IXGBE_DOWN, &adapter->state) || 7626 if (test_bit(__IXGBE_DOWN, &adapter->state) ||
7626 test_bit(__IXGBE_REMOVING, &adapter->state) || 7627 test_bit(__IXGBE_REMOVING, &adapter->state) ||
7627 test_bit(__IXGBE_RESETTING, &adapter->state)) 7628 test_bit(__IXGBE_RESETTING, &adapter->state)) {
7629 rtnl_unlock();
7628 return; 7630 return;
7631 }
7629 7632
7630 ixgbe_dump(adapter); 7633 ixgbe_dump(adapter);
7631 netdev_err(adapter->netdev, "Reset adapter\n"); 7634 netdev_err(adapter->netdev, "Reset adapter\n");
7632 adapter->tx_timeout_count++; 7635 adapter->tx_timeout_count++;
7633 7636
7634 rtnl_lock();
7635 ixgbe_reinit_locked(adapter); 7637 ixgbe_reinit_locked(adapter);
7636 rtnl_unlock(); 7638 rtnl_unlock();
7637} 7639}