Commit 169f4076 authored by Mitch Williams's avatar Mitch Williams Committed by Jeff Kirsher

i40evf: fix panic on PF driver fail

Fix a panic that would occur in the VF if the PF driver failed or was
removed from the host kernel. In this case, the VF driver calls
i40evf_close(), but this function does nothing because the driver is in
the resetting state. Because of this, the driver doesn't free its irqs
and causes a kernel panic when it tries to disable MSI-X.

Change-ID: If95644a89e554b4d7be0dca1b6add26f63047129
Signed-off-by: default avatarMitch Williams <mitch.a.williams@intel.com>
Signed-off-by: default avatarCatherine Sullivan <catherine.sullivan@intel.com>
Tested-by: default avatarSibai Li <sibai.li@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 014269ff
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include "i40e_prototype.h" #include "i40e_prototype.h"
static int i40evf_setup_all_tx_resources(struct i40evf_adapter *adapter); static int i40evf_setup_all_tx_resources(struct i40evf_adapter *adapter);
static int i40evf_setup_all_rx_resources(struct i40evf_adapter *adapter); static int i40evf_setup_all_rx_resources(struct i40evf_adapter *adapter);
static void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter);
static void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter);
static int i40evf_close(struct net_device *netdev); static int i40evf_close(struct net_device *netdev);
char i40evf_driver_name[] = "i40evf"; char i40evf_driver_name[] = "i40evf";
...@@ -1534,9 +1536,13 @@ static void i40evf_reset_task(struct work_struct *work) ...@@ -1534,9 +1536,13 @@ static void i40evf_reset_task(struct work_struct *work)
rstat_val); rstat_val);
adapter->flags |= I40EVF_FLAG_PF_COMMS_FAILED; adapter->flags |= I40EVF_FLAG_PF_COMMS_FAILED;
if (netif_running(adapter->netdev)) if (netif_running(adapter->netdev)) {
i40evf_close(adapter->netdev); set_bit(__I40E_DOWN, &adapter->vsi.state);
i40evf_down(adapter);
i40evf_free_traffic_irqs(adapter);
i40evf_free_all_tx_resources(adapter);
i40evf_free_all_rx_resources(adapter);
}
i40evf_free_misc_irq(adapter); i40evf_free_misc_irq(adapter);
i40evf_reset_interrupt_capability(adapter); i40evf_reset_interrupt_capability(adapter);
i40evf_free_queues(adapter); i40evf_free_queues(adapter);
......
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