aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNetanel Belgazal <netanel@amazon.com>2018-09-09 04:15:22 -0400
committerDavid S. Miller <davem@davemloft.net>2018-09-09 10:59:55 -0400
commitcfa324a514233b28a6934de619183eee941f02d7 (patch)
treee641227b14798641b55385b957dc528c1179229a
parentef5b0771d247379c90c8bf1332ff32f7f74bff7f (diff)
net: ena: fix device destruction to gracefully free resources
When ena_destroy_device() is called from ena_suspend(), the device is still reachable from the driver. Therefore, the driver can send a command to the device to free all resources. However, in all other cases of calling ena_destroy_device(), the device is potentially in an error state and unreachable from the driver. In these cases the driver must not send commands to the device. The current implementation does not request resource freeing from the device even when possible. We add the graceful parameter to ena_destroy_device() to enable resource freeing when possible, and use it in ena_suspend(). Signed-off-by: Netanel Belgazal <netanel@amazon.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/amazon/ena/ena_netdev.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 69e684fd2787..035d47d2179a 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -76,7 +76,7 @@ MODULE_DEVICE_TABLE(pci, ena_pci_tbl);
76 76
77static int ena_rss_init_default(struct ena_adapter *adapter); 77static int ena_rss_init_default(struct ena_adapter *adapter);
78static void check_for_admin_com_state(struct ena_adapter *adapter); 78static void check_for_admin_com_state(struct ena_adapter *adapter);
79static void ena_destroy_device(struct ena_adapter *adapter); 79static void ena_destroy_device(struct ena_adapter *adapter, bool graceful);
80static int ena_restore_device(struct ena_adapter *adapter); 80static int ena_restore_device(struct ena_adapter *adapter);
81 81
82static void ena_tx_timeout(struct net_device *dev) 82static void ena_tx_timeout(struct net_device *dev)
@@ -1900,7 +1900,7 @@ static int ena_close(struct net_device *netdev)
1900 "Destroy failure, restarting device\n"); 1900 "Destroy failure, restarting device\n");
1901 ena_dump_stats_to_dmesg(adapter); 1901 ena_dump_stats_to_dmesg(adapter);
1902 /* rtnl lock already obtained in dev_ioctl() layer */ 1902 /* rtnl lock already obtained in dev_ioctl() layer */
1903 ena_destroy_device(adapter); 1903 ena_destroy_device(adapter, false);
1904 ena_restore_device(adapter); 1904 ena_restore_device(adapter);
1905 } 1905 }
1906 1906
@@ -2550,7 +2550,7 @@ err_disable_msix:
2550 return rc; 2550 return rc;
2551} 2551}
2552 2552
2553static void ena_destroy_device(struct ena_adapter *adapter) 2553static void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
2554{ 2554{
2555 struct net_device *netdev = adapter->netdev; 2555 struct net_device *netdev = adapter->netdev;
2556 struct ena_com_dev *ena_dev = adapter->ena_dev; 2556 struct ena_com_dev *ena_dev = adapter->ena_dev;
@@ -2563,7 +2563,8 @@ static void ena_destroy_device(struct ena_adapter *adapter)
2563 dev_up = test_bit(ENA_FLAG_DEV_UP, &adapter->flags); 2563 dev_up = test_bit(ENA_FLAG_DEV_UP, &adapter->flags);
2564 adapter->dev_up_before_reset = dev_up; 2564 adapter->dev_up_before_reset = dev_up;
2565 2565
2566 ena_com_set_admin_running_state(ena_dev, false); 2566 if (!graceful)
2567 ena_com_set_admin_running_state(ena_dev, false);
2567 2568
2568 if (test_bit(ENA_FLAG_DEV_UP, &adapter->flags)) 2569 if (test_bit(ENA_FLAG_DEV_UP, &adapter->flags))
2569 ena_down(adapter); 2570 ena_down(adapter);
@@ -2665,7 +2666,7 @@ static void ena_fw_reset_device(struct work_struct *work)
2665 return; 2666 return;
2666 } 2667 }
2667 rtnl_lock(); 2668 rtnl_lock();
2668 ena_destroy_device(adapter); 2669 ena_destroy_device(adapter, false);
2669 ena_restore_device(adapter); 2670 ena_restore_device(adapter);
2670 rtnl_unlock(); 2671 rtnl_unlock();
2671} 2672}
@@ -3467,7 +3468,7 @@ static int ena_suspend(struct pci_dev *pdev, pm_message_t state)
3467 "ignoring device reset request as the device is being suspended\n"); 3468 "ignoring device reset request as the device is being suspended\n");
3468 clear_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags); 3469 clear_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
3469 } 3470 }
3470 ena_destroy_device(adapter); 3471 ena_destroy_device(adapter, true);
3471 rtnl_unlock(); 3472 rtnl_unlock();
3472 return 0; 3473 return 0;
3473} 3474}