Whamcloud - gitweb
LU-14661 lnet: Provide kernel API for adding peers
authorChris Horn <chris.horn@hpe.com>
Wed, 2 Sep 2020 20:07:25 +0000 (15:07 -0500)
committerAndreas Dilger <adilger@whamcloud.com>
Fri, 4 Nov 2022 03:55:37 +0000 (03:55 +0000)
Implement LNetAddPeer() API to allow other kernel modules to add
peers to LNet.

Peers created via this API are not marked as having been configured
by DLC. As such, they can be overwritten by discovery.

Lustre-change: https://review.whamcloud.com/43509
Lustre-commit: ac201366ad5700edc860c139955af8a09bf53a1a

Test-Parameters: trivial
HPE-bug-id: LUS-9293
Signed-off-by: Chris Horn <chris.horn@hpe.com>
Change-Id: Ibb057f702ea29d60233fbd1680d8caec98064d5d
Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/48965
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Frank Sehr <fsehr@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lnet/include/lnet/api.h
lnet/include/lnet/lib-lnet.h
lnet/lnet/api-ni.c
lnet/lnet/peer.c

index b3901f5..375afd4 100644 (file)
@@ -163,6 +163,7 @@ int LNetClearLazyPortal(int portal);
 int LNetCtl(unsigned int cmd, void *arg);
 void LNetDebugPeer(struct lnet_process_id id);
 int LNetGetPeerDiscoveryStatus(void);
+int LNetAddPeer(lnet_nid_t *nids, __u32 num_nids);
 
 /** @} lnet_misc */
 
index 93858f6..7b89709 100644 (file)
@@ -905,7 +905,7 @@ struct lnet_peer_net *lnet_peer_get_net_locked(struct lnet_peer *peer,
                                               __u32 net_id);
 bool lnet_peer_is_pref_nid_locked(struct lnet_peer_ni *lpni, lnet_nid_t nid);
 int lnet_peer_ni_set_non_mr_pref_nid(struct lnet_peer_ni *lpni, lnet_nid_t nid);
-int lnet_add_peer_ni(lnet_nid_t key_nid, lnet_nid_t nid, bool mr);
+int lnet_add_peer_ni(lnet_nid_t key_nid, lnet_nid_t nid, bool mr, bool temp);
 int lnet_del_peer_ni(lnet_nid_t key_nid, lnet_nid_t nid);
 int lnet_get_peer_info(struct lnet_ioctl_peer_cfg *cfg, void __user *bulk);
 int lnet_get_peer_ni_info(__u32 peer_index, __u64 *nid,
index 48350f2..879dc38 100644 (file)
@@ -3902,7 +3902,7 @@ LNetCtl(unsigned int cmd, void *arg)
                mutex_lock(&the_lnet.ln_api_mutex);
                rc = lnet_add_peer_ni(cfg->prcfg_prim_nid,
                                      cfg->prcfg_cfg_nid,
-                                     cfg->prcfg_mr);
+                                     cfg->prcfg_mr, false);
                mutex_unlock(&the_lnet.ln_api_mutex);
                return rc;
        }
index a1bd1d4..beec750 100644 (file)
@@ -1210,6 +1210,51 @@ lnet_is_discovery_disabled(struct lnet_peer *lp)
        return rc;
 }
 
+int
+LNetAddPeer(lnet_nid_t *nids, __u32 num_nids)
+{
+       lnet_nid_t pnid = 0;
+       bool mr;
+       int i, rc;
+
+       if (!nids || num_nids < 1)
+               return -EINVAL;
+
+       rc = LNetNIInit(LNET_PID_ANY);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&the_lnet.ln_api_mutex);
+
+       mr = lnet_peer_discovery_disabled == 0;
+
+       rc = 0;
+       for (i = 0; i < num_nids; i++) {
+               if (nids[i] == LNET_NID_LO_0)
+                       continue;
+
+               if (!pnid) {
+                       pnid = nids[i];
+                       rc = lnet_add_peer_ni(pnid, LNET_NID_ANY, mr, true);
+               } else if (lnet_peer_discovery_disabled) {
+                       rc = lnet_add_peer_ni(nids[i], LNET_NID_ANY, mr, true);
+               } else {
+                       rc = lnet_add_peer_ni(pnid, nids[i], mr, true);
+               }
+
+               if (rc && rc != -EEXIST)
+                       goto unlock;
+       }
+
+unlock:
+       mutex_unlock(&the_lnet.ln_api_mutex);
+
+       LNetNIFini();
+
+       return rc == -EEXIST ? 0 : rc;
+}
+EXPORT_SYMBOL(LNetAddPeer);
+
 lnet_nid_t
 LNetPrimaryNID(lnet_nid_t nid)
 {
@@ -1415,6 +1460,11 @@ lnet_peer_add(lnet_nid_t nid, unsigned flags)
                        else if ((lp->lp_state ^ flags) & LNET_PEER_MULTI_RAIL)
                                rc = -EPERM;
                        goto out;
+               } else if (!(flags & LNET_PEER_CONFIGURED)) {
+                       if (lp->lp_primary_nid == nid) {
+                               rc = -EEXIST;
+                               goto out;
+                       }
                }
                /* Delete and recreate as a configured peer. */
                lnet_peer_del(lp);
@@ -1653,17 +1703,19 @@ out:
  * being created/modified/deleted by a different thread.
  */
 int
-lnet_add_peer_ni(lnet_nid_t prim_nid, lnet_nid_t nid, bool mr)
+lnet_add_peer_ni(lnet_nid_t prim_nid, lnet_nid_t nid, bool mr, bool temp)
 {
        struct lnet_peer *lp = NULL;
        struct lnet_peer_ni *lpni;
-       unsigned flags;
+       unsigned int flags = 0;
 
        /* The prim_nid must always be specified */
        if (prim_nid == LNET_NID_ANY)
                return -EINVAL;
 
-       flags = LNET_PEER_CONFIGURED;
+       if (!temp)
+               flags = LNET_PEER_CONFIGURED;
+
        if (mr)
                flags |= LNET_PEER_MULTI_RAIL;
 
@@ -1682,7 +1734,7 @@ lnet_add_peer_ni(lnet_nid_t prim_nid, lnet_nid_t nid, bool mr)
        lp = lpni->lpni_peer_net->lpn_peer;
 
        /* Peer must have been configured. */
-       if (!(lp->lp_state & LNET_PEER_CONFIGURED)) {
+       if (!temp && !(lp->lp_state & LNET_PEER_CONFIGURED)) {
                CDEBUG(D_NET, "peer %s was not configured\n",
                       libcfs_nid2str(prim_nid));
                return -ENOENT;