Whamcloud - gitweb
LU-14661 lnet: Provide kernel API for adding peers 09/43509/5
authorChris Horn <chris.horn@hpe.com>
Wed, 2 Sep 2020 20:07:25 +0000 (15:07 -0500)
committerOleg Drokin <green@whamcloud.com>
Wed, 18 Aug 2021 01:58:52 +0000 (01:58 +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.

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/43509
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Reviewed-by: Alexander Boyko <alexander.boyko@hpe.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/include/lnet/api.h
lnet/include/lnet/lib-lnet.h
lnet/lnet/api-ni.c
lnet/lnet/peer.c

index ac36370..8871124 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 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 */
 
 
 /** @} lnet_misc */
 
index 0e53550..96991bd 100644 (file)
@@ -923,7 +923,7 @@ bool lnet_peer_is_pref_rtr_locked(struct lnet_peer_ni *lpni, lnet_nid_t gw_nid);
 void lnet_peer_clr_pref_rtrs(struct lnet_peer_ni *lpni);
 int lnet_peer_add_pref_rtr(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);
 void lnet_peer_clr_pref_rtrs(struct lnet_peer_ni *lpni);
 int lnet_peer_add_pref_rtr(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,
 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 c128f6b..11af33b 100644 (file)
@@ -4081,7 +4081,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,
                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;
        }
                mutex_unlock(&the_lnet.ln_api_mutex);
                return rc;
        }
index 9087d99..33bd351 100644 (file)
@@ -1328,6 +1328,51 @@ lnet_is_discovery_disabled(struct lnet_peer *lp)
        return rc;
 }
 
        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)
 {
 lnet_nid_t
 LNetPrimaryNID(lnet_nid_t nid)
 {
@@ -1548,6 +1593,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 ((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);
                }
                /* Delete and recreate as a configured peer. */
                lnet_peer_del(lp);
@@ -1786,17 +1836,19 @@ out:
  * being created/modified/deleted by a different thread.
  */
 int
  * 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;
 {
        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;
 
 
        /* 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;
 
        if (mr)
                flags |= LNET_PEER_MULTI_RAIL;
 
@@ -1815,7 +1867,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. */
        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;
                CDEBUG(D_NET, "peer %s was not configured\n",
                       libcfs_nid2str(prim_nid));
                return -ENOENT;