net/smc: unlock LGR pending lock earlier for SMC-D
If SMC client and server connections are both established at the same time, smc_connect_ism() cannot send a CLC confirm message while smc_listen_work() is waiting for one due to lock contention. This can result in timeouts in smc_clc_wait_msg() and failed SMC connections. In case of SMC-D, the LGR pending lock is not needed while smc_listen_work() is waiting for the CLC confirm message. So, this patch releases the lock earlier for SMC-D to avoid the locking issue. Signed-off-by: Hans Wippel <hwippel@linux.ibm.com> Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a225d2cd88
commit
62c7139f3e
|
@ -1287,24 +1287,28 @@ static void smc_listen_work(struct work_struct *work)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SMC-D does not need this lock any more */
|
||||||
|
if (ism_supported)
|
||||||
|
mutex_unlock(&smc_create_lgr_pending);
|
||||||
|
|
||||||
/* receive SMC Confirm CLC message */
|
/* receive SMC Confirm CLC message */
|
||||||
reason_code = smc_clc_wait_msg(new_smc, &cclc, sizeof(cclc),
|
reason_code = smc_clc_wait_msg(new_smc, &cclc, sizeof(cclc),
|
||||||
SMC_CLC_CONFIRM, CLC_WAIT_TIME);
|
SMC_CLC_CONFIRM, CLC_WAIT_TIME);
|
||||||
if (reason_code) {
|
if (reason_code) {
|
||||||
mutex_unlock(&smc_create_lgr_pending);
|
if (!ism_supported)
|
||||||
|
mutex_unlock(&smc_create_lgr_pending);
|
||||||
smc_listen_decline(new_smc, reason_code, local_contact);
|
smc_listen_decline(new_smc, reason_code, local_contact);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* finish worker */
|
/* finish worker */
|
||||||
if (!ism_supported) {
|
if (!ism_supported) {
|
||||||
if (smc_listen_rdma_finish(new_smc, &cclc, local_contact)) {
|
rc = smc_listen_rdma_finish(new_smc, &cclc, local_contact);
|
||||||
mutex_unlock(&smc_create_lgr_pending);
|
mutex_unlock(&smc_create_lgr_pending);
|
||||||
|
if (rc)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
smc_conn_save_peer_info(new_smc, &cclc);
|
smc_conn_save_peer_info(new_smc, &cclc);
|
||||||
mutex_unlock(&smc_create_lgr_pending);
|
|
||||||
smc_listen_out_connected(new_smc);
|
smc_listen_out_connected(new_smc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue