diff options
author | David S. Miller <davem@davemloft.net> | 2018-11-24 20:01:43 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-11-24 20:01:43 -0500 |
commit | b1bf78bfb2e4c9ffa03ccdbc60d89a2f7c5fd82c (patch) | |
tree | fcd93c3f54a72ca6a6ee97f015efebe6d80a3271 /drivers/net/ethernet/ibm/ibmvnic.c | |
parent | aea0a897af9e44c258e8ab9296fad417f1bc063a (diff) | |
parent | d146194f31c96f9b260c5a1cf1592d2e7f82a2e2 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
-rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 72 |
1 files changed, 31 insertions, 41 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index c9d5d0a7fbf1..c0203a0d5e3b 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c | |||
@@ -485,8 +485,8 @@ static void release_rx_pools(struct ibmvnic_adapter *adapter) | |||
485 | 485 | ||
486 | for (j = 0; j < rx_pool->size; j++) { | 486 | for (j = 0; j < rx_pool->size; j++) { |
487 | if (rx_pool->rx_buff[j].skb) { | 487 | if (rx_pool->rx_buff[j].skb) { |
488 | dev_kfree_skb_any(rx_pool->rx_buff[i].skb); | 488 | dev_kfree_skb_any(rx_pool->rx_buff[j].skb); |
489 | rx_pool->rx_buff[i].skb = NULL; | 489 | rx_pool->rx_buff[j].skb = NULL; |
490 | } | 490 | } |
491 | } | 491 | } |
492 | 492 | ||
@@ -1103,20 +1103,15 @@ static int ibmvnic_open(struct net_device *netdev) | |||
1103 | return 0; | 1103 | return 0; |
1104 | } | 1104 | } |
1105 | 1105 | ||
1106 | mutex_lock(&adapter->reset_lock); | ||
1107 | |||
1108 | if (adapter->state != VNIC_CLOSED) { | 1106 | if (adapter->state != VNIC_CLOSED) { |
1109 | rc = ibmvnic_login(netdev); | 1107 | rc = ibmvnic_login(netdev); |
1110 | if (rc) { | 1108 | if (rc) |
1111 | mutex_unlock(&adapter->reset_lock); | ||
1112 | return rc; | 1109 | return rc; |
1113 | } | ||
1114 | 1110 | ||
1115 | rc = init_resources(adapter); | 1111 | rc = init_resources(adapter); |
1116 | if (rc) { | 1112 | if (rc) { |
1117 | netdev_err(netdev, "failed to initialize resources\n"); | 1113 | netdev_err(netdev, "failed to initialize resources\n"); |
1118 | release_resources(adapter); | 1114 | release_resources(adapter); |
1119 | mutex_unlock(&adapter->reset_lock); | ||
1120 | return rc; | 1115 | return rc; |
1121 | } | 1116 | } |
1122 | } | 1117 | } |
@@ -1124,8 +1119,6 @@ static int ibmvnic_open(struct net_device *netdev) | |||
1124 | rc = __ibmvnic_open(netdev); | 1119 | rc = __ibmvnic_open(netdev); |
1125 | netif_carrier_on(netdev); | 1120 | netif_carrier_on(netdev); |
1126 | 1121 | ||
1127 | mutex_unlock(&adapter->reset_lock); | ||
1128 | |||
1129 | return rc; | 1122 | return rc; |
1130 | } | 1123 | } |
1131 | 1124 | ||
@@ -1269,10 +1262,8 @@ static int ibmvnic_close(struct net_device *netdev) | |||
1269 | return 0; | 1262 | return 0; |
1270 | } | 1263 | } |
1271 | 1264 | ||
1272 | mutex_lock(&adapter->reset_lock); | ||
1273 | rc = __ibmvnic_close(netdev); | 1265 | rc = __ibmvnic_close(netdev); |
1274 | ibmvnic_cleanup(netdev); | 1266 | ibmvnic_cleanup(netdev); |
1275 | mutex_unlock(&adapter->reset_lock); | ||
1276 | 1267 | ||
1277 | return rc; | 1268 | return rc; |
1278 | } | 1269 | } |
@@ -1746,6 +1737,7 @@ static int do_reset(struct ibmvnic_adapter *adapter, | |||
1746 | struct ibmvnic_rwi *rwi, u32 reset_state) | 1737 | struct ibmvnic_rwi *rwi, u32 reset_state) |
1747 | { | 1738 | { |
1748 | u64 old_num_rx_queues, old_num_tx_queues; | 1739 | u64 old_num_rx_queues, old_num_tx_queues; |
1740 | u64 old_num_rx_slots, old_num_tx_slots; | ||
1749 | struct net_device *netdev = adapter->netdev; | 1741 | struct net_device *netdev = adapter->netdev; |
1750 | int i, rc; | 1742 | int i, rc; |
1751 | 1743 | ||
@@ -1757,6 +1749,8 @@ static int do_reset(struct ibmvnic_adapter *adapter, | |||
1757 | 1749 | ||
1758 | old_num_rx_queues = adapter->req_rx_queues; | 1750 | old_num_rx_queues = adapter->req_rx_queues; |
1759 | old_num_tx_queues = adapter->req_tx_queues; | 1751 | old_num_tx_queues = adapter->req_tx_queues; |
1752 | old_num_rx_slots = adapter->req_rx_add_entries_per_subcrq; | ||
1753 | old_num_tx_slots = adapter->req_tx_entries_per_subcrq; | ||
1760 | 1754 | ||
1761 | ibmvnic_cleanup(netdev); | 1755 | ibmvnic_cleanup(netdev); |
1762 | 1756 | ||
@@ -1819,21 +1813,20 @@ static int do_reset(struct ibmvnic_adapter *adapter, | |||
1819 | if (rc) | 1813 | if (rc) |
1820 | return rc; | 1814 | return rc; |
1821 | } else if (adapter->req_rx_queues != old_num_rx_queues || | 1815 | } else if (adapter->req_rx_queues != old_num_rx_queues || |
1822 | adapter->req_tx_queues != old_num_tx_queues) { | 1816 | adapter->req_tx_queues != old_num_tx_queues || |
1823 | adapter->map_id = 1; | 1817 | adapter->req_rx_add_entries_per_subcrq != |
1818 | old_num_rx_slots || | ||
1819 | adapter->req_tx_entries_per_subcrq != | ||
1820 | old_num_tx_slots) { | ||
1824 | release_rx_pools(adapter); | 1821 | release_rx_pools(adapter); |
1825 | release_tx_pools(adapter); | 1822 | release_tx_pools(adapter); |
1826 | rc = init_rx_pools(netdev); | ||
1827 | if (rc) | ||
1828 | return rc; | ||
1829 | rc = init_tx_pools(netdev); | ||
1830 | if (rc) | ||
1831 | return rc; | ||
1832 | |||
1833 | release_napi(adapter); | 1823 | release_napi(adapter); |
1834 | rc = init_napi(adapter); | 1824 | release_vpd_data(adapter); |
1825 | |||
1826 | rc = init_resources(adapter); | ||
1835 | if (rc) | 1827 | if (rc) |
1836 | return rc; | 1828 | return rc; |
1829 | |||
1837 | } else { | 1830 | } else { |
1838 | rc = reset_tx_pools(adapter); | 1831 | rc = reset_tx_pools(adapter); |
1839 | if (rc) | 1832 | if (rc) |
@@ -1917,17 +1910,8 @@ static int do_hard_reset(struct ibmvnic_adapter *adapter, | |||
1917 | adapter->state = VNIC_PROBED; | 1910 | adapter->state = VNIC_PROBED; |
1918 | return 0; | 1911 | return 0; |
1919 | } | 1912 | } |
1920 | /* netif_set_real_num_xx_queues needs to take rtnl lock here | 1913 | |
1921 | * unless wait_for_reset is set, in which case the rtnl lock | 1914 | rc = init_resources(adapter); |
1922 | * has already been taken before initializing the reset | ||
1923 | */ | ||
1924 | if (!adapter->wait_for_reset) { | ||
1925 | rtnl_lock(); | ||
1926 | rc = init_resources(adapter); | ||
1927 | rtnl_unlock(); | ||
1928 | } else { | ||
1929 | rc = init_resources(adapter); | ||
1930 | } | ||
1931 | if (rc) | 1915 | if (rc) |
1932 | return rc; | 1916 | return rc; |
1933 | 1917 | ||
@@ -1986,13 +1970,21 @@ static void __ibmvnic_reset(struct work_struct *work) | |||
1986 | struct ibmvnic_rwi *rwi; | 1970 | struct ibmvnic_rwi *rwi; |
1987 | struct ibmvnic_adapter *adapter; | 1971 | struct ibmvnic_adapter *adapter; |
1988 | struct net_device *netdev; | 1972 | struct net_device *netdev; |
1973 | bool we_lock_rtnl = false; | ||
1989 | u32 reset_state; | 1974 | u32 reset_state; |
1990 | int rc = 0; | 1975 | int rc = 0; |
1991 | 1976 | ||
1992 | adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset); | 1977 | adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset); |
1993 | netdev = adapter->netdev; | 1978 | netdev = adapter->netdev; |
1994 | 1979 | ||
1995 | mutex_lock(&adapter->reset_lock); | 1980 | /* netif_set_real_num_xx_queues needs to take rtnl lock here |
1981 | * unless wait_for_reset is set, in which case the rtnl lock | ||
1982 | * has already been taken before initializing the reset | ||
1983 | */ | ||
1984 | if (!adapter->wait_for_reset) { | ||
1985 | rtnl_lock(); | ||
1986 | we_lock_rtnl = true; | ||
1987 | } | ||
1996 | reset_state = adapter->state; | 1988 | reset_state = adapter->state; |
1997 | 1989 | ||
1998 | rwi = get_next_rwi(adapter); | 1990 | rwi = get_next_rwi(adapter); |
@@ -2020,12 +2012,11 @@ static void __ibmvnic_reset(struct work_struct *work) | |||
2020 | if (rc) { | 2012 | if (rc) { |
2021 | netdev_dbg(adapter->netdev, "Reset failed\n"); | 2013 | netdev_dbg(adapter->netdev, "Reset failed\n"); |
2022 | free_all_rwi(adapter); | 2014 | free_all_rwi(adapter); |
2023 | mutex_unlock(&adapter->reset_lock); | ||
2024 | return; | ||
2025 | } | 2015 | } |
2026 | 2016 | ||
2027 | adapter->resetting = false; | 2017 | adapter->resetting = false; |
2028 | mutex_unlock(&adapter->reset_lock); | 2018 | if (we_lock_rtnl) |
2019 | rtnl_unlock(); | ||
2029 | } | 2020 | } |
2030 | 2021 | ||
2031 | static int ibmvnic_reset(struct ibmvnic_adapter *adapter, | 2022 | static int ibmvnic_reset(struct ibmvnic_adapter *adapter, |
@@ -4768,7 +4759,6 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id) | |||
4768 | 4759 | ||
4769 | INIT_WORK(&adapter->ibmvnic_reset, __ibmvnic_reset); | 4760 | INIT_WORK(&adapter->ibmvnic_reset, __ibmvnic_reset); |
4770 | INIT_LIST_HEAD(&adapter->rwi_list); | 4761 | INIT_LIST_HEAD(&adapter->rwi_list); |
4771 | mutex_init(&adapter->reset_lock); | ||
4772 | mutex_init(&adapter->rwi_lock); | 4762 | mutex_init(&adapter->rwi_lock); |
4773 | adapter->resetting = false; | 4763 | adapter->resetting = false; |
4774 | 4764 | ||
@@ -4840,8 +4830,8 @@ static int ibmvnic_remove(struct vio_dev *dev) | |||
4840 | struct ibmvnic_adapter *adapter = netdev_priv(netdev); | 4830 | struct ibmvnic_adapter *adapter = netdev_priv(netdev); |
4841 | 4831 | ||
4842 | adapter->state = VNIC_REMOVING; | 4832 | adapter->state = VNIC_REMOVING; |
4843 | unregister_netdev(netdev); | 4833 | rtnl_lock(); |
4844 | mutex_lock(&adapter->reset_lock); | 4834 | unregister_netdevice(netdev); |
4845 | 4835 | ||
4846 | release_resources(adapter); | 4836 | release_resources(adapter); |
4847 | release_sub_crqs(adapter, 1); | 4837 | release_sub_crqs(adapter, 1); |
@@ -4852,7 +4842,7 @@ static int ibmvnic_remove(struct vio_dev *dev) | |||
4852 | 4842 | ||
4853 | adapter->state = VNIC_REMOVED; | 4843 | adapter->state = VNIC_REMOVED; |
4854 | 4844 | ||
4855 | mutex_unlock(&adapter->reset_lock); | 4845 | rtnl_unlock(); |
4856 | device_remove_file(&dev->dev, &dev_attr_failover); | 4846 | device_remove_file(&dev->dev, &dev_attr_failover); |
4857 | free_netdev(netdev); | 4847 | free_netdev(netdev); |
4858 | dev_set_drvdata(&dev->dev, NULL); | 4848 | dev_set_drvdata(&dev->dev, NULL); |