From owner-svn-src-head@freebsd.org Mon Oct 14 20:22:26 2019 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id C3E3513655C; Mon, 14 Oct 2019 20:22:26 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46sVNL4jYKz3LJY; Mon, 14 Oct 2019 20:22:26 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3BB0CA8FE; Mon, 14 Oct 2019 20:22:26 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x9EKMQIs069894; Mon, 14 Oct 2019 20:22:26 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x9EKMQeo069893; Mon, 14 Oct 2019 20:22:26 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201910142022.x9EKMQeo069893@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Mon, 14 Oct 2019 20:22:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r353504 - head/sys/ofed/drivers/infiniband/ulp/ipoib X-SVN-Group: head X-SVN-Commit-Author: glebius X-SVN-Commit-Paths: head/sys/ofed/drivers/infiniband/ulp/ipoib X-SVN-Commit-Revision: 353504 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Oct 2019 20:22:26 -0000 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); }