Commit 0cc318d2 authored by Jedrzej Jagielski's avatar Jedrzej Jagielski Committed by Tony Nguyen

iavf: Fix deadlock occurrence during resetting VF interface

System hangs if close the interface is called from the kernel during
the interface is in resetting state.
During resetting operation the link is closing but kernel didn't
know it and it tried to close this interface again what sometimes
led to deadlock.
Inform kernel about current state of interface
and turn off the flag IFF_UP when interface is closing until reset
is finished.
Previously it was most likely to hang the system when kernel
(network manager) tried to close the interface in the same time
when interface was in resetting state because of deadlock.

Fixes: 3c8e0b98 ("i40vf: don't stop me now")
Signed-off-by: default avatarJaroslaw Gawin <jaroslawx.gawin@intel.com>
Signed-off-by: default avatarJedrzej Jagielski <jedrzej.jagielski@intel.com>
Tested-by: default avatarKonrad Jankowski <konrad0.jankowski@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent e792779e
...@@ -2254,6 +2254,7 @@ static void iavf_reset_task(struct work_struct *work) ...@@ -2254,6 +2254,7 @@ static void iavf_reset_task(struct work_struct *work)
(adapter->state == __IAVF_RESETTING)); (adapter->state == __IAVF_RESETTING));
if (running) { if (running) {
netdev->flags &= ~IFF_UP;
netif_carrier_off(netdev); netif_carrier_off(netdev);
netif_tx_stop_all_queues(netdev); netif_tx_stop_all_queues(netdev);
adapter->link_up = false; adapter->link_up = false;
...@@ -2365,7 +2366,7 @@ static void iavf_reset_task(struct work_struct *work) ...@@ -2365,7 +2366,7 @@ static void iavf_reset_task(struct work_struct *work)
* to __IAVF_RUNNING * to __IAVF_RUNNING
*/ */
iavf_up_complete(adapter); iavf_up_complete(adapter);
netdev->flags |= IFF_UP;
iavf_irq_enable(adapter, true); iavf_irq_enable(adapter, true);
} else { } else {
iavf_change_state(adapter, __IAVF_DOWN); iavf_change_state(adapter, __IAVF_DOWN);
...@@ -2378,8 +2379,10 @@ static void iavf_reset_task(struct work_struct *work) ...@@ -2378,8 +2379,10 @@ static void iavf_reset_task(struct work_struct *work)
reset_err: reset_err:
mutex_unlock(&adapter->client_lock); mutex_unlock(&adapter->client_lock);
mutex_unlock(&adapter->crit_lock); mutex_unlock(&adapter->crit_lock);
if (running) if (running) {
iavf_change_state(adapter, __IAVF_RUNNING); iavf_change_state(adapter, __IAVF_RUNNING);
netdev->flags |= IFF_UP;
}
dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n"); dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n");
iavf_close(netdev); iavf_close(netdev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment