[lustre-devel] [PATCH 18/22] lnet: extend lnet_is_nid_in_ping_info()

James Simmons <[email protected]>
Newsgroups org.lustre.lists.lustre-devel
Message-ID <[email protected]>
From: Mr NeilBrown <[email protected]>

lnet_is_nid_in_ping_info() now checks the ping_info for both
nid4 and larger nids.

WC-bug-id: https://jira.whamcloud.com/browse/LU-10391
Lustre-commit: 56bcfbf22d91b96c3 ("LU-10391 lnet: extend lnet_is_nid_in_ping_info()")
Signed-off-by: Mr NeilBrown <[email protected]>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/44629
Reviewed-by: Oleg Drokin <[email protected]>
Reviewed-by: Frank Sehr <[email protected]>
Reviewed-by: James Simmons <[email protected]>
Signed-off-by: James Simmons <[email protected]>
---
 include/linux/lnet/lib-lnet.h |  9 ++++++
 net/lnet/lnet/peer.c          | 71 +++++++++++++++++++++++++++++++++++++------
 2 files changed, 70 insertions(+), 10 deletions(-)

diff --git a/include/linux/lnet/lib-lnet.h b/include/linux/lnet/lib-lnet.h
index 13ce2bf..7ce6cff 100644
--- a/include/linux/lnet/lib-lnet.h
+++ b/include/linux/lnet/lib-lnet.h
@@ -886,6 +886,15 @@ static inline void lnet_ping_buffer_decref(struct lnet_ping_buffer *pbuf)
 	}
 }
 
+struct lnet_ping_iter {
+	struct lnet_ping_info	*pinfo;
+	void			*pos, *end;
+};
+
+u32 *ping_iter_first(struct lnet_ping_iter *pi, struct lnet_ping_buffer *pbuf,
+		     struct lnet_nid *nid);
+u32 *ping_iter_next(struct lnet_ping_iter *pi, struct lnet_nid *nid);
+
 static inline int lnet_push_target_resize_needed(void)
 {
 	return the_lnet.ln_push_target->pb_nbytes < the_lnet.ln_push_target_nbytes;
diff --git a/net/lnet/lnet/peer.c b/net/lnet/lnet/peer.c
index 35b135e..b33d6ac 100644
--- a/net/lnet/lnet/peer.c
+++ b/net/lnet/lnet/peer.c
@@ -2875,6 +2875,56 @@ static void lnet_discovery_event_handler(struct lnet_event *event)
 	lnet_net_unlock(LNET_LOCK_EX);
 }
 
+u32 *ping_iter_first(struct lnet_ping_iter *pi,
+		     struct lnet_ping_buffer *pbuf,
+		     struct lnet_nid *nid)
+{
+	pi->pinfo = &pbuf->pb_info;
+	pi->pos = &pbuf->pb_info.pi_ni;
+	pi->end = (void *)pi->pinfo +
+		  min_t(int, pbuf->pb_nbytes,
+			lnet_ping_info_size(pi->pinfo));
+	/* lnet_ping_info_validiate ensures there will be one
+	 * lnet_ni_status at the start
+	 */
+	if (nid)
+		lnet_nid4_to_nid(pbuf->pb_info.pi_ni[0].ns_nid, nid);
+	return &pbuf->pb_info.pi_ni[0].ns_status;
+}
+
+u32 *ping_iter_next(struct lnet_ping_iter *pi, struct lnet_nid *nid)
+{
+	int off = offsetof(struct lnet_ping_info, pi_ni[pi->pinfo->pi_nnis]);
+
+	if (pi->pos < ((void *)pi->pinfo + off)) {
+		struct lnet_ni_status *ns = pi->pos;
+
+		pi->pos = ns + 1;
+		if (pi->pos > pi->end)
+			return NULL;
+		if (nid)
+			lnet_nid4_to_nid(ns->ns_nid, nid);
+		return &ns->ns_status;
+	}
+
+	while (pi->pinfo->pi_features & LNET_PING_FEAT_LARGE_ADDR) {
+		struct lnet_ni_large_status *lns = pi->pos;
+
+		if (pi->pos + 8 > pi->end)
+			/* Not safe to examine next */
+			return NULL;
+		pi->pos = lnet_ping_sts_next(lns);
+		if (pi->pos > pi->end)
+			return NULL;
+		if (NID_BYTES(&lns->ns_nid) > sizeof(struct lnet_nid))
+			continue;
+		if (nid)
+			*nid = lns->ns_nid;
+		return &lns->ns_status;
+	}
+	return NULL;
+}
+
 /*
  * Build a peer from incoming data.
  *
@@ -3140,16 +3190,18 @@ static int lnet_peer_merge_data(struct lnet_peer *lp,
 	return 0;
 }
 
-static bool lnet_is_nid_in_ping_info(lnet_nid_t nid,
-				     struct lnet_ping_info *pinfo)
+static bool lnet_is_nid_in_ping_info(struct lnet_nid *nid,
+				     struct lnet_ping_buffer *pbuf)
 {
-	int i;
-
-	for (i = 0; i < pinfo->pi_nnis; i++) {
-		if (pinfo->pi_ni[i].ns_nid == nid)
+	struct lnet_ping_iter pi;
+	struct lnet_nid pnid;
+	u32 *st;
+
+	for (st = ping_iter_first(&pi, pbuf, &pnid);
+	     st;
+	     st = ping_iter_next(&pi, &pnid))
+		if (nid_same(nid, &pnid))
 			return true;
-	}
-
 	return false;
 }
 
@@ -3308,8 +3360,7 @@ static int lnet_peer_data_present(struct lnet_peer *lp)
 	 * recorded in that peer.
 	 */
 	} else if (nid_same(&lp->lp_primary_nid, &nid) ||
-		   (lnet_is_nid_in_ping_info(lnet_nid_to_nid4(&lp->lp_primary_nid),
-					     &pbuf->pb_info) &&
+		   (lnet_is_nid_in_ping_info(&lp->lp_primary_nid, pbuf) &&
 		    lnet_is_discovery_disabled(lp))) {
 		rc = lnet_peer_merge_data(lp, pbuf);
 	} else {
-- 
1.8.3.1

_______________________________________________
lustre-devel mailing list
[email protected]
http://lists.lustre.org/listinfo.cgi/lustre-devel-lustre.org
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.