summaryrefslogtreecommitdiffstats
path: root/net/smc
diff options
context:
space:
mode:
authorUrsula Braun <ubraun@linux.vnet.ibm.com>2017-07-28 07:56:13 -0400
committerDavid S. Miller <davem@davemloft.net>2017-07-29 14:22:57 -0400
commit977bb32440e7342e28838d9c0260681637ac97c4 (patch)
treedc117496ce45bee19f127fea2a9bbf49791b96e4 /net/smc
parentbdb0effcc0a9e636c0a5406bc2eb78474436143d (diff)
net/smc: serialize connection creation in all cases
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>
Diffstat (limited to 'net/smc')
-rw-r--r--net/smc/af_smc.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 6793d7348cc8..120a7b9b4d8e 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -779,11 +779,6 @@ static void smc_listen_work(struct work_struct *work)
779 mutex_lock(&smc_create_lgr_pending); 779 mutex_lock(&smc_create_lgr_pending);
780 local_contact = smc_conn_create(new_smc, peeraddr.sin_addr.s_addr, 780 local_contact = smc_conn_create(new_smc, peeraddr.sin_addr.s_addr,
781 smcibdev, ibport, &pclc.lcl, 0); 781 smcibdev, ibport, &pclc.lcl, 0);
782 if (local_contact == SMC_REUSE_CONTACT)
783 /* lock no longer needed, free it due to following
784 * smc_clc_wait_msg() call
785 */
786 mutex_unlock(&smc_create_lgr_pending);
787 if (local_contact < 0) { 782 if (local_contact < 0) {
788 rc = local_contact; 783 rc = local_contact;
789 if (rc == -ENOMEM) 784 if (rc == -ENOMEM)
@@ -853,8 +848,7 @@ out_connected:
853 if (newsmcsk->sk_state == SMC_INIT) 848 if (newsmcsk->sk_state == SMC_INIT)
854 newsmcsk->sk_state = SMC_ACTIVE; 849 newsmcsk->sk_state = SMC_ACTIVE;
855enqueue: 850enqueue:
856 if (local_contact == SMC_FIRST_CONTACT) 851 mutex_unlock(&smc_create_lgr_pending);
857 mutex_unlock(&smc_create_lgr_pending);
858 lock_sock_nested(&lsmc->sk, SINGLE_DEPTH_NESTING); 852 lock_sock_nested(&lsmc->sk, SINGLE_DEPTH_NESTING);
859 if (lsmc->sk.sk_state == SMC_LISTEN) { 853 if (lsmc->sk.sk_state == SMC_LISTEN) {
860 smc_accept_enqueue(&lsmc->sk, newsmcsk); 854 smc_accept_enqueue(&lsmc->sk, newsmcsk);