net/smc: improve server ISM device determination
authorUrsula Braun <ubraun@linux.ibm.com>
Thu, 10 Sep 2020 16:48:24 +0000 (18:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Sep 2020 22:24:26 +0000 (15:24 -0700)
Move check whether peer can be reached into smc_pnet_find_ism_by_pnetid().
Thus searching continues for another ism device, if check fails.

Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/af_smc.c
net/smc/smc_clc.h
net/smc/smc_pnet.c

index fa97144..f27a596 100644 (file)
@@ -1188,26 +1188,12 @@ static int smc_listen_ism_init(struct smc_sock *new_smc,
                               struct smc_clc_msg_proposal *pclc,
                               struct smc_init_info *ini)
 {
-       struct smc_clc_msg_smcd *pclc_smcd;
        int rc;
 
-       pclc_smcd = smc_get_clc_msg_smcd(pclc);
-       ini->ism_peer_gid = pclc_smcd->gid;
        rc = smc_conn_create(new_smc, ini);
        if (rc)
                return rc;
 
-       /* Check if peer can be reached via ISM device */
-       if (smc_ism_cantalk(new_smc->conn.lgr->peer_gid,
-                           new_smc->conn.lgr->vlan_id,
-                           new_smc->conn.lgr->smcd)) {
-               if (ini->first_contact_local)
-                       smc_lgr_cleanup_early(&new_smc->conn);
-               else
-                       smc_conn_free(&new_smc->conn);
-               return SMC_CLC_DECL_SMCDNOTALK;
-       }
-
        /* Create send and receive buffers */
        rc = smc_buf_create(new_smc, true);
        if (rc) {
@@ -1338,7 +1324,10 @@ static void smc_listen_work(struct work_struct *work)
 
        /* check if ISM is available */
        if (pclc->hdr.path == SMC_TYPE_D || pclc->hdr.path == SMC_TYPE_B) {
+               struct smc_clc_msg_smcd *pclc_smcd = smc_get_clc_msg_smcd(pclc);
+
                ini.is_smcd = true; /* prepare ISM check */
+               ini.ism_peer_gid = pclc_smcd->gid;
                rc = smc_find_ism_device(new_smc, &ini);
                if (!rc)
                        rc = smc_listen_ism_init(new_smc, pclc, &ini);
index fda474e..fcd8521 100644 (file)
@@ -37,7 +37,6 @@
 #define SMC_CLC_DECL_NOSMCDEV  0x03030000  /* no SMC device found (R or D)   */
 #define SMC_CLC_DECL_NOSMCDDEV 0x03030001  /* no SMC-D device found          */
 #define SMC_CLC_DECL_NOSMCRDEV 0x03030002  /* no SMC-R device found          */
-#define SMC_CLC_DECL_SMCDNOTALK        0x03030003  /* SMC-D dev can't talk to peer   */
 #define SMC_CLC_DECL_MODEUNSUPP        0x03040000  /* smc modes do not match (R or D)*/
 #define SMC_CLC_DECL_RMBE_EC   0x03050000  /* peer has eyecatcher in RMBE    */
 #define SMC_CLC_DECL_OPTUNSUPP 0x03060000  /* fastopen sockopt not supported */
index 30e5fac..70684c4 100644 (file)
@@ -928,7 +928,10 @@ static void smc_pnet_find_ism_by_pnetid(struct net_device *ndev,
        mutex_lock(&smcd_dev_list.mutex);
        list_for_each_entry(ismdev, &smcd_dev_list.list, list) {
                if (smc_pnet_match(ismdev->pnetid, ndev_pnetid) &&
-                   !ismdev->going_away) {
+                   !ismdev->going_away &&
+                   (!ini->ism_peer_gid ||
+                    !smc_ism_cantalk(ini->ism_peer_gid, ini->vlan_id,
+                                     ismdev))) {
                        ini->ism_dev = ismdev;
                        break;
                }