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:
Hans Wippel 2019-02-07 15:56:17 +01:00 committed by David S. Miller
parent a225d2cd88
commit 62c7139f3e

View File

@ -1287,10 +1287,15 @@ static void smc_listen_work(struct work_struct *work)
return;
}
/* SMC-D does not need this lock any more */
if (ism_supported)
mutex_unlock(&smc_create_lgr_pending);
/* receive SMC Confirm CLC message */
reason_code = smc_clc_wait_msg(new_smc, &cclc, sizeof(cclc),
SMC_CLC_CONFIRM, CLC_WAIT_TIME);
if (reason_code) {
if (!ism_supported)
mutex_unlock(&smc_create_lgr_pending);
smc_listen_decline(new_smc, reason_code, local_contact);
return;
@ -1298,13 +1303,12 @@ static void smc_listen_work(struct work_struct *work)
/* finish worker */
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);
if (rc)
return;
}
}
smc_conn_save_peer_info(new_smc, &cclc);
mutex_unlock(&smc_create_lgr_pending);
smc_listen_out_connected(new_smc);
}