]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
net/smc: consolidate unlocking in same function
authorKarsten Graul <kgraul@linux.ibm.com>
Wed, 7 Oct 2020 20:57:41 +0000 (22:57 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 10 Oct 2020 01:15:47 +0000 (18:15 -0700)
Static code checkers warn of inconsistent returns because the lgr mutex
is locked in one function and unlocked in a function called by the
locking function:
net/smc/af_smc.c:823 smc_connect_rdma() warn: inconsistent returns 'smc_client_lgr_pending'.
net/smc/af_smc.c:897 smc_connect_ism() warn: inconsistent returns 'smc_server_lgr_pending'.

Make the code consistent by doing the unlock in the same function that
fetches the lock. No functional changes.

Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/smc/af_smc.c

index 670e802a73cb0d71fa56fb82ed8d89813eeddebd..fbe98bb202997278a68fd83e0d0bb6d036456511 100644 (file)
@@ -553,23 +553,12 @@ static int smc_connect_decline_fallback(struct smc_sock *smc, int reason_code,
 }
 
 /* abort connecting */
-static int smc_connect_abort(struct smc_sock *smc, int reason_code,
-                            int local_first)
+static void smc_connect_abort(struct smc_sock *smc, int local_first)
 {
-       bool is_smcd = smc->conn.lgr->is_smcd;
-
        if (local_first)
                smc_lgr_cleanup_early(&smc->conn);
        else
                smc_conn_free(&smc->conn);
-       if (is_smcd)
-               /* there is only one lgr role for SMC-D; use server lock */
-               mutex_unlock(&smc_server_lgr_pending);
-       else
-               mutex_unlock(&smc_client_lgr_pending);
-
-       smc->connect_nonblock = 0;
-       return reason_code;
 }
 
 /* check if there is a rdma device available for this connection. */
@@ -764,43 +753,47 @@ static int smc_connect_rdma(struct smc_sock *smc,
                                break;
                        }
                }
-               if (!link)
-                       return smc_connect_abort(smc, SMC_CLC_DECL_NOSRVLINK,
-                                                ini->first_contact_local);
+               if (!link) {
+                       reason_code = SMC_CLC_DECL_NOSRVLINK;
+                       goto connect_abort;
+               }
                smc->conn.lnk = link;
        }
 
        /* create send buffer and rmb */
-       if (smc_buf_create(smc, false))
-               return smc_connect_abort(smc, SMC_CLC_DECL_MEM,
-                                        ini->first_contact_local);
+       if (smc_buf_create(smc, false)) {
+               reason_code = SMC_CLC_DECL_MEM;
+               goto connect_abort;
+       }
 
        if (ini->first_contact_local)
                smc_link_save_peer_info(link, aclc);
 
-       if (smc_rmb_rtoken_handling(&smc->conn, link, aclc))
-               return smc_connect_abort(smc, SMC_CLC_DECL_ERR_RTOK,
-                                        ini->first_contact_local);
+       if (smc_rmb_rtoken_handling(&smc->conn, link, aclc)) {
+               reason_code = SMC_CLC_DECL_ERR_RTOK;
+               goto connect_abort;
+       }
 
        smc_close_init(smc);
        smc_rx_init(smc);
 
        if (ini->first_contact_local) {
-               if (smc_ib_ready_link(link))
-                       return smc_connect_abort(smc, SMC_CLC_DECL_ERR_RDYLNK,
-                                                ini->first_contact_local);
+               if (smc_ib_ready_link(link)) {
+                       reason_code = SMC_CLC_DECL_ERR_RDYLNK;
+                       goto connect_abort;
+               }
        } else {
-               if (smcr_lgr_reg_rmbs(link, smc->conn.rmb_desc))
-                       return smc_connect_abort(smc, SMC_CLC_DECL_ERR_REGRMB,
-                                                ini->first_contact_local);
+               if (smcr_lgr_reg_rmbs(link, smc->conn.rmb_desc)) {
+                       reason_code = SMC_CLC_DECL_ERR_REGRMB;
+                       goto connect_abort;
+               }
        }
        smc_rmb_sync_sg_for_device(&smc->conn);
 
        reason_code = smc_clc_send_confirm(smc, ini->first_contact_local,
                                           SMC_V1);
        if (reason_code)
-               return smc_connect_abort(smc, reason_code,
-                                        ini->first_contact_local);
+               goto connect_abort;
 
        smc_tx_init(smc);
 
@@ -810,8 +803,7 @@ static int smc_connect_rdma(struct smc_sock *smc,
                reason_code = smcr_clnt_conf_first_link(smc);
                smc_llc_flow_stop(link->lgr, &link->lgr->llc_flow_lcl);
                if (reason_code)
-                       return smc_connect_abort(smc, reason_code,
-                                                ini->first_contact_local);
+                       goto connect_abort;
        }
        mutex_unlock(&smc_client_lgr_pending);
 
@@ -821,6 +813,12 @@ static int smc_connect_rdma(struct smc_sock *smc,
                smc->sk.sk_state = SMC_ACTIVE;
 
        return 0;
+connect_abort:
+       smc_connect_abort(smc, ini->first_contact_local);
+       mutex_unlock(&smc_client_lgr_pending);
+       smc->connect_nonblock = 0;
+
+       return reason_code;
 }
 
 /* The server has chosen one of the proposed ISM devices for the communication.
@@ -872,11 +870,10 @@ static int smc_connect_ism(struct smc_sock *smc,
 
        /* Create send and receive buffers */
        rc = smc_buf_create(smc, true);
-       if (rc)
-               return smc_connect_abort(smc, (rc == -ENOSPC) ?
-                                             SMC_CLC_DECL_MAX_DMB :
-                                             SMC_CLC_DECL_MEM,
-                                        ini->first_contact_local);
+       if (rc) {
+               rc = (rc == -ENOSPC) ? SMC_CLC_DECL_MAX_DMB : SMC_CLC_DECL_MEM;
+               goto connect_abort;
+       }
 
        smc_conn_save_peer_info(smc, aclc);
        smc_close_init(smc);
@@ -886,7 +883,7 @@ static int smc_connect_ism(struct smc_sock *smc,
        rc = smc_clc_send_confirm(smc, ini->first_contact_local,
                                  aclc->hdr.version);
        if (rc)
-               return smc_connect_abort(smc, rc, ini->first_contact_local);
+               goto connect_abort;
        mutex_unlock(&smc_server_lgr_pending);
 
        smc_copy_sock_settings_to_clc(smc);
@@ -895,6 +892,12 @@ static int smc_connect_ism(struct smc_sock *smc,
                smc->sk.sk_state = SMC_ACTIVE;
 
        return 0;
+connect_abort:
+       smc_connect_abort(smc, ini->first_contact_local);
+       mutex_unlock(&smc_server_lgr_pending);
+       smc->connect_nonblock = 0;
+
+       return rc;
 }
 
 /* check if received accept type and version matches a proposed one */