Message ID | 1566922204-8770-1-git-send-email-tlfalcon@linux.ibm.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net] ibmvnic: Do not process reset during or after device removal | expand |
From: Thomas Falcon <tlfalcon@linux.ibm.com> Date: Tue, 27 Aug 2019 11:10:04 -0500 > Currently, the ibmvnic driver will not schedule device resets > if the device is being removed, but does not check the device > state before the reset is actually processed. This leads to a race > where a reset is scheduled with a valid device state but is > processed after the driver has been removed, resulting in an oops. > > Fix this by checking the device state before processing a queued > reset event. > > Reported-by: Abdul Haleem <abdhalee@linux.vnet.ibm.com> > Tested-by: Abdul Haleem <abdhalee@linux.vnet.ibm.com> > Signed-off-by: Thomas Falcon <tlfalcon@linux.ibm.com> Applied.
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index cebd20f..fa4bb94 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -1983,6 +1983,10 @@ static void __ibmvnic_reset(struct work_struct *work) rwi = get_next_rwi(adapter); while (rwi) { + if (adapter->state == VNIC_REMOVING || + adapter->state == VNIC_REMOVED) + goto out; + if (adapter->force_reset_recovery) { adapter->force_reset_recovery = false; rc = do_hard_reset(adapter, rwi, reset_state); @@ -2007,7 +2011,7 @@ static void __ibmvnic_reset(struct work_struct *work) netdev_dbg(adapter->netdev, "Reset failed\n"); free_all_rwi(adapter); } - +out: adapter->resetting = false; if (we_lock_rtnl) rtnl_unlock();