aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Falcon <tlfalcon@linux.vnet.ibm.com>2018-05-24 15:37:53 -0400
committerDavid S. Miller <davem@davemloft.net>2018-05-25 16:32:48 -0400
commiteb110410b9f6477726026669f3f0c0567e8241e6 (patch)
tree02ae95f908d6d915c7833e68229d638cf150018b
parentd2f30f5172603bacaf34f0fdb021c25ad1915b05 (diff)
ibmvnic: Fix partial success login retries
In its current state, the driver will handle backing device login in a loop for a certain number of retries while the device returns a partial success, indicating that the driver may need to try again using a smaller number of resources. The variable it checks to continue retrying may change over the course of operations, resulting in reallocation of resources but exits without sending the login attempt. Guard against this by introducing a boolean variable that will retain the state indicating that the driver needs to reattempt login with backing device firmware. Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 62cd3602c633..5ec1185808e5 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -796,9 +796,11 @@ static int ibmvnic_login(struct net_device *netdev)
796 struct ibmvnic_adapter *adapter = netdev_priv(netdev); 796 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
797 unsigned long timeout = msecs_to_jiffies(30000); 797 unsigned long timeout = msecs_to_jiffies(30000);
798 int retry_count = 0; 798 int retry_count = 0;
799 bool retry;
799 int rc; 800 int rc;
800 801
801 do { 802 do {
803 retry = false;
802 if (retry_count > IBMVNIC_MAX_QUEUES) { 804 if (retry_count > IBMVNIC_MAX_QUEUES) {
803 netdev_warn(netdev, "Login attempts exceeded\n"); 805 netdev_warn(netdev, "Login attempts exceeded\n");
804 return -1; 806 return -1;
@@ -822,6 +824,9 @@ static int ibmvnic_login(struct net_device *netdev)
822 retry_count++; 824 retry_count++;
823 release_sub_crqs(adapter, 1); 825 release_sub_crqs(adapter, 1);
824 826
827 retry = true;
828 netdev_dbg(netdev,
829 "Received partial success, retrying...\n");
825 adapter->init_done_rc = 0; 830 adapter->init_done_rc = 0;
826 reinit_completion(&adapter->init_done); 831 reinit_completion(&adapter->init_done);
827 send_cap_queries(adapter); 832 send_cap_queries(adapter);
@@ -849,7 +854,7 @@ static int ibmvnic_login(struct net_device *netdev)
849 netdev_warn(netdev, "Adapter login failed\n"); 854 netdev_warn(netdev, "Adapter login failed\n");
850 return -1; 855 return -1;
851 } 856 }
852 } while (adapter->init_done_rc == PARTIALSUCCESS); 857 } while (retry);
853 858
854 /* handle pending MAC address changes after successful login */ 859 /* handle pending MAC address changes after successful login */
855 if (adapter->mac_change_pending) { 860 if (adapter->mac_change_pending) {