diff options
author | Tony Nguyen <anthony.l.nguyen@intel.com> | 2018-05-30 12:05:12 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2018-06-04 13:25:15 -0400 |
commit | 88adce4ea8f96b5191df2bea76905814cc3814e2 (patch) | |
tree | edc6117dc98d990a01043d6a501d65078eb51b67 | |
parent | cc5b114dcf986bfd8e4c37bf65d1b7b1e5290ac6 (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.c | 6 |
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 | } |