Skip to content

Commit 095d370

Browse files
committed
Merge branch 'ibmvnic-Fix-parameter-change-request-handling'
Nathan Fontenot says: ==================== ibmvnic: Fix parameter change request handling When updating parameters for the ibmvnic driver there is a possibility of entering an infinite loop if a return value other that a partial success is received from sending the login CRQ. Also, a deadlock can occur on the rtnl lock if netdev_notify_peers() is called during driver reset for a parameter change reset. This patch set corrects both of these issues by updating the return code handling in ibmvnic_login() nand gaurding against calling netdev_notify_peers() for parameter change requests. Updates for V2: Correct spelling mistakes in commit messages. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 7dd07c1 + ebc701b commit 095d370

File tree

2 files changed

+37
-22
lines changed

2 files changed

+37
-22
lines changed

drivers/net/ethernet/ibm/ibmvnic.c

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -794,46 +794,61 @@ static int ibmvnic_login(struct net_device *netdev)
794794
{
795795
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
796796
unsigned long timeout = msecs_to_jiffies(30000);
797-
struct device *dev = &adapter->vdev->dev;
797+
int retry_count = 0;
798798
int rc;
799799

800800
do {
801-
if (adapter->renegotiate) {
802-
adapter->renegotiate = false;
801+
if (retry_count > IBMVNIC_MAX_QUEUES) {
802+
netdev_warn(netdev, "Login attempts exceeded\n");
803+
return -1;
804+
}
805+
806+
adapter->init_done_rc = 0;
807+
reinit_completion(&adapter->init_done);
808+
rc = send_login(adapter);
809+
if (rc) {
810+
netdev_warn(netdev, "Unable to login\n");
811+
return rc;
812+
}
813+
814+
if (!wait_for_completion_timeout(&adapter->init_done,
815+
timeout)) {
816+
netdev_warn(netdev, "Login timed out\n");
817+
return -1;
818+
}
819+
820+
if (adapter->init_done_rc == PARTIALSUCCESS) {
821+
retry_count++;
803822
release_sub_crqs(adapter, 1);
804823

824+
adapter->init_done_rc = 0;
805825
reinit_completion(&adapter->init_done);
806826
send_cap_queries(adapter);
807827
if (!wait_for_completion_timeout(&adapter->init_done,
808828
timeout)) {
809-
dev_err(dev, "Capabilities query timeout\n");
829+
netdev_warn(netdev,
830+
"Capabilities query timed out\n");
810831
return -1;
811832
}
833+
812834
rc = init_sub_crqs(adapter);
813835
if (rc) {
814-
dev_err(dev,
815-
"Initialization of SCRQ's failed\n");
836+
netdev_warn(netdev,
837+
"SCRQ initialization failed\n");
816838
return -1;
817839
}
840+
818841
rc = init_sub_crq_irqs(adapter);
819842
if (rc) {
820-
dev_err(dev,
821-
"Initialization of SCRQ's irqs failed\n");
843+
netdev_warn(netdev,
844+
"SCRQ irq initialization failed\n");
822845
return -1;
823846
}
824-
}
825-
826-
reinit_completion(&adapter->init_done);
827-
rc = send_login(adapter);
828-
if (rc) {
829-
dev_err(dev, "Unable to attempt device login\n");
830-
return rc;
831-
} else if (!wait_for_completion_timeout(&adapter->init_done,
832-
timeout)) {
833-
dev_err(dev, "Login timeout\n");
847+
} else if (adapter->init_done_rc) {
848+
netdev_warn(netdev, "Adapter login failed\n");
834849
return -1;
835850
}
836-
} while (adapter->renegotiate);
851+
} while (adapter->init_done_rc == PARTIALSUCCESS);
837852

838853
/* handle pending MAC address changes after successful login */
839854
if (adapter->mac_change_pending) {
@@ -1828,7 +1843,8 @@ static int do_reset(struct ibmvnic_adapter *adapter,
18281843
for (i = 0; i < adapter->req_rx_queues; i++)
18291844
napi_schedule(&adapter->napi[i]);
18301845

1831-
if (adapter->reset_reason != VNIC_RESET_FAILOVER)
1846+
if (adapter->reset_reason != VNIC_RESET_FAILOVER &&
1847+
adapter->reset_reason != VNIC_RESET_CHANGE_PARAM)
18321848
netdev_notify_peers(netdev);
18331849

18341850
netif_carrier_on(netdev);
@@ -3942,7 +3958,7 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,
39423958
* to resend the login buffer with fewer queues requested.
39433959
*/
39443960
if (login_rsp_crq->generic.rc.code) {
3945-
adapter->renegotiate = true;
3961+
adapter->init_done_rc = login_rsp_crq->generic.rc.code;
39463962
complete(&adapter->init_done);
39473963
return 0;
39483964
}

drivers/net/ethernet/ibm/ibmvnic.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,6 @@ struct ibmvnic_adapter {
10351035

10361036
struct ibmvnic_sub_crq_queue **tx_scrq;
10371037
struct ibmvnic_sub_crq_queue **rx_scrq;
1038-
bool renegotiate;
10391038

10401039
/* rx structs */
10411040
struct napi_struct *napi;

0 commit comments

Comments
 (0)