svn commit: r353504 - head/sys/ofed/drivers/infiniband/ulp/ipoib

Gleb Smirnoff glebius at FreeBSD.org
Mon Oct 14 20:22:26 UTC 2019


Author: glebius
Date: Mon Oct 14 20:22:25 2019
New Revision: 353504
URL: https://svnweb.freebsd.org/changeset/base/353504

Log:
  Convert to if_foreach_llmaddr() KPI.
  
  Reviewed by:	hselasky

Modified:
  head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c

Modified: head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	Mon Oct 14 20:21:02 2019	(r353503)
+++ head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	Mon Oct 14 20:22:25 2019	(r353504)
@@ -734,21 +734,87 @@ void ipoib_mcast_restart_task(struct work_struct *work
 	ipoib_mcast_restart(priv);
 }
 
+struct ipoib_mcast_ctx {
+	struct ipoib_dev_priv *priv;
+	struct list_head remove_list;
+};
+
+static u_int
+ipoib_process_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	struct ipoib_mcast_ctx *ctx = arg;
+	struct ipoib_dev_priv *priv = ctx->priv;
+	struct ipoib_mcast *mcast;
+	struct ib_sa_mcmember_rec rec;
+	union ib_gid mgid;
+	uint8_t *addr;
+	int addrlen;
+
+	addr = LLADDR(sdl);
+	addrlen = sdl->sdl_alen;
+	if (!ipoib_mcast_addr_is_valid(addr, addrlen,
+	    priv->dev->if_broadcastaddr))
+		return (0);
+
+	memcpy(mgid.raw, addr + 4, sizeof mgid);
+
+	mcast = __ipoib_mcast_find(priv, &mgid);
+	if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
+		struct ipoib_mcast *nmcast;
+
+		/* ignore group which is directly joined by userspace */
+		if (test_bit(IPOIB_FLAG_UMCAST, &priv->flags) &&
+		    !ib_sa_get_mcmember_rec(priv->ca, priv->port, &mgid, &rec)) {
+			ipoib_dbg_mcast(priv, "ignoring multicast entry for mgid %16D\n",
+					mgid.raw, ":");
+			return (0);
+		}
+
+		/* Not found or send-only group, let's add a new entry */
+		ipoib_dbg_mcast(priv, "adding multicast entry for mgid %16D\n",
+				mgid.raw, ":");
+
+		nmcast = ipoib_mcast_alloc(priv, 0);
+		if (!nmcast) {
+			ipoib_warn(priv, "unable to allocate memory for multicast structure\n");
+			return (0);
+		}
+
+		set_bit(IPOIB_MCAST_FLAG_FOUND, &nmcast->flags);
+
+		nmcast->mcmember.mgid = mgid;
+
+		if (mcast) {
+			/* Destroy the send only entry */
+			list_move_tail(&mcast->list, &ctx->remove_list);
+
+			rb_replace_node(&mcast->rb_node,
+					&nmcast->rb_node,
+					&priv->multicast_tree);
+		} else
+			__ipoib_mcast_add(priv, nmcast);
+
+		list_add_tail(&nmcast->list, &priv->multicast_list);
+	}
+
+	if (mcast)
+		set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
+
+	return (1);
+}
+
 void ipoib_mcast_restart(struct ipoib_dev_priv *priv)
 {
+	struct ipoib_mcast_ctx ctx = { priv,
+	    { &ctx.remove_list, &ctx.remove_list }};
 	struct ifnet *dev = priv->dev;
-	struct ifmultiaddr *ifma;
 	struct ipoib_mcast *mcast, *tmcast;
-	LIST_HEAD(remove_list);
-	struct ib_sa_mcmember_rec rec;
-	int addrlen;
 
 	ipoib_dbg_mcast(priv, "restarting multicast task flags 0x%lX\n",
 	    priv->flags);
 
 	ipoib_mcast_stop_thread(priv, 0);
 
-	if_maddr_rlock(dev);
 	spin_lock(&priv->lock);
 
 	/*
@@ -762,65 +828,9 @@ void ipoib_mcast_restart(struct ipoib_dev_priv *priv)
 		clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
 
 	/* Mark all of the entries that are found or don't exist */
+	ctx.priv = priv;
+	if_foreach_llmaddr(dev, ipoib_process_maddr, &ctx);
 
-
-	CK_STAILQ_FOREACH(ifma, &dev->if_multiaddrs, ifma_link) {
-		union ib_gid mgid;
-		uint8_t *addr;
-
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		addr = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
-		addrlen = ((struct sockaddr_dl *)ifma->ifma_addr)->sdl_alen;
-		if (!ipoib_mcast_addr_is_valid(addr, addrlen,
-					       dev->if_broadcastaddr))
-			continue;
-
-		memcpy(mgid.raw, addr + 4, sizeof mgid);
-
-		mcast = __ipoib_mcast_find(priv, &mgid);
-		if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
-			struct ipoib_mcast *nmcast;
-
-			/* ignore group which is directly joined by userspace */
-			if (test_bit(IPOIB_FLAG_UMCAST, &priv->flags) &&
-			    !ib_sa_get_mcmember_rec(priv->ca, priv->port, &mgid, &rec)) {
-				ipoib_dbg_mcast(priv, "ignoring multicast entry for mgid %16D\n",
-						mgid.raw, ":");
-				continue;
-			}
-
-			/* Not found or send-only group, let's add a new entry */
-			ipoib_dbg_mcast(priv, "adding multicast entry for mgid %16D\n",
-					mgid.raw, ":");
-
-			nmcast = ipoib_mcast_alloc(priv, 0);
-			if (!nmcast) {
-				ipoib_warn(priv, "unable to allocate memory for multicast structure\n");
-				continue;
-			}
-
-			set_bit(IPOIB_MCAST_FLAG_FOUND, &nmcast->flags);
-
-			nmcast->mcmember.mgid = mgid;
-
-			if (mcast) {
-				/* Destroy the send only entry */
-				list_move_tail(&mcast->list, &remove_list);
-
-				rb_replace_node(&mcast->rb_node,
-						&nmcast->rb_node,
-						&priv->multicast_tree);
-			} else
-				__ipoib_mcast_add(priv, nmcast);
-
-			list_add_tail(&nmcast->list, &priv->multicast_list);
-		}
-
-		if (mcast)
-			set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
-	}
-
 	/* Remove all of the entries don't exist anymore */
 	list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
 		if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) &&
@@ -831,15 +841,14 @@ void ipoib_mcast_restart(struct ipoib_dev_priv *priv)
 			rb_erase(&mcast->rb_node, &priv->multicast_tree);
 
 			/* Move to the remove list */
-			list_move_tail(&mcast->list, &remove_list);
+			list_move_tail(&mcast->list, &ctx.remove_list);
 		}
 	}
 
 	spin_unlock(&priv->lock);
-	if_maddr_runlock(dev);
 
 	/* We have to cancel outside of the spinlock */
-	list_for_each_entry_safe(mcast, tmcast, &remove_list, list) {
+	list_for_each_entry_safe(mcast, tmcast, &ctx.remove_list, list) {
 		ipoib_mcast_leave(mcast->priv, mcast);
 		ipoib_mcast_free(mcast);
 	}


More information about the svn-src-head mailing list