OSDN Git Service

ixgbe: fix possible race in reset subtask
authorTony Nguyen <anthony.l.nguyen@intel.com>
Wed, 30 May 2018 16:05:12 +0000 (09:05 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Mon, 4 Jun 2018 17:25:15 +0000 (10:25 -0700)
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>
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index ba3035c..dd8a3a0 100644 (file)
@@ -7621,17 +7621,19 @@ static void ixgbe_reset_subtask(struct ixgbe_adapter *adapter)
        if (!test_and_clear_bit(__IXGBE_RESET_REQUESTED, &adapter->state))
                return;
 
+       rtnl_lock();
        /* If we're already down, removing or resetting, just bail */
        if (test_bit(__IXGBE_DOWN, &adapter->state) ||
            test_bit(__IXGBE_REMOVING, &adapter->state) ||
-           test_bit(__IXGBE_RESETTING, &adapter->state))
+           test_bit(__IXGBE_RESETTING, &adapter->state)) {
+               rtnl_unlock();
                return;
+       }
 
        ixgbe_dump(adapter);
        netdev_err(adapter->netdev, "Reset adapter\n");
        adapter->tx_timeout_count++;
 
-       rtnl_lock();
        ixgbe_reinit_locked(adapter);
        rtnl_unlock();
 }