net/smc: serialize connection creation in all cases
authorUrsula Braun <ubraun@linux.vnet.ibm.com>
Fri, 28 Jul 2017 11:56:13 +0000 (13:56 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 29 Jul 2017 18:22:57 +0000 (11:22 -0700)
If a link group for a new server connection exists already, the mutex
serializing the determination of link groups is given up early.
The coming registration of memory regions benefits from the serialization
as well, if the mutex is held till connection creation is finished.
This patch postpones the unlocking of the link group creation mutex.

Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/af_smc.c

index 6793d7348cc811f41395c5ca3a9d1f1390813646..120a7b9b4d8e501aaa2a5ad37a295605a13806cd 100644 (file)
@@ -779,11 +779,6 @@ static void smc_listen_work(struct work_struct *work)
        mutex_lock(&smc_create_lgr_pending);
        local_contact = smc_conn_create(new_smc, peeraddr.sin_addr.s_addr,
                                        smcibdev, ibport, &pclc.lcl, 0);
-       if (local_contact == SMC_REUSE_CONTACT)
-               /* lock no longer needed, free it due to following
-                * smc_clc_wait_msg() call
-                */
-               mutex_unlock(&smc_create_lgr_pending);
        if (local_contact < 0) {
                rc = local_contact;
                if (rc == -ENOMEM)
@@ -853,8 +848,7 @@ out_connected:
        if (newsmcsk->sk_state == SMC_INIT)
                newsmcsk->sk_state = SMC_ACTIVE;
 enqueue:
-       if (local_contact == SMC_FIRST_CONTACT)
-               mutex_unlock(&smc_create_lgr_pending);
+       mutex_unlock(&smc_create_lgr_pending);
        lock_sock_nested(&lsmc->sk, SINGLE_DEPTH_NESTING);
        if (lsmc->sk.sk_state == SMC_LISTEN) {
                smc_accept_enqueue(&lsmc->sk, newsmcsk);