Explorar el Código

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>
Tony Nguyen hace 7 años
padre
commit
88adce4ea8
Se han modificado 1 ficheros con 4 adiciones y 2 borrados
  1. 4 2
      drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

+ 4 - 2
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

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