From owner-freebsd-net@FreeBSD.ORG Thu Nov 19 14:46:27 2009 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 23FFF106566B for ; Thu, 19 Nov 2009 14:46:27 +0000 (UTC) (envelope-from bms@incunabulum.net) Received: from out4.smtp.messagingengine.com (out4.smtp.messagingengine.com [66.111.4.28]) by mx1.freebsd.org (Postfix) with ESMTP id E8BE58FC0C for ; Thu, 19 Nov 2009 14:46:26 +0000 (UTC) Received: from compute2.internal (compute2.internal [10.202.2.42]) by gateway1.messagingengine.com (Postfix) with ESMTP id 1A022BE626 for ; Thu, 19 Nov 2009 09:46:26 -0500 (EST) Received: from heartbeat1.messagingengine.com ([10.202.2.160]) by compute2.internal (MEProxy); Thu, 19 Nov 2009 09:46:26 -0500 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=messagingengine.com; h=message-id:date:from:mime-version:to:subject:content-type; s=smtpout; bh=puzVbUaSzur6VsCkPrM+snskS5I=; b=O9wvAYQ1iRV4DDbb2qj3OBxv1nXzw2C5kKneN6P6eDGQ2vLrRlwgTgHnnfSpnaEI/9XADd4fAFzzRYfFTG/4Be9M3tzuYpPuEvzubn4zsvd9GInJwD1yy9+fyiEHRzNF475uJXXAa35L2r9+XzRK/OoPZpN57EYbvZRkbeIQy9Y= X-Sasl-enc: C+NDih8p2K35Zn+/KmVE8Q0cbjMNXDw3I19bpjv1WVRs 1258641985 Received: from anglepoise.lon.incunabulum.net (82-35-112-254.cable.ubr07.dals.blueyonder.co.uk [82.35.112.254]) by mail.messagingengine.com (Postfix) with ESMTPSA id 5DC064B3A7E for ; Thu, 19 Nov 2009 09:46:25 -0500 (EST) Message-ID: <4B055A17.9080503@incunabulum.net> Date: Thu, 19 Nov 2009 14:45:43 +0000 From: Bruce Simpson User-Agent: Thunderbird 2.0.0.23 (X11/20090824) MIME-Version: 1.0 To: FreeBSD Net Content-Type: multipart/mixed; boundary="------------080101090006010303010009" Subject: [PATCH] CFR: use refcount(9) in mcast X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 Nov 2009 14:46:27 -0000 This is a multi-part message in MIME format. --------------080101090006010303010009 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Look OK? All accesses are covered by a mutex, so the atomic ops aren't really needed -- but it makes for clearer source. --------------080101090006010303010009 Content-Type: text/plain; name="mcast-refcount9.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mcast-refcount9.diff" Index: netinet/in_mcast.c =================================================================== --- netinet/in_mcast.c (revision 199528) +++ netinet/in_mcast.c (working copy) @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -396,13 +397,7 @@ inm = inm_lookup(ifp, *group); if (inm != NULL) { - /* - * If we already joined this group, just bump the - * refcount and return it. - */ - KASSERT(inm->inm_refcount >= 1, - ("%s: bad refcount %d", __func__, inm->inm_refcount)); - ++inm->inm_refcount; + refcount_acquire(&inm->inm_refcount); *pinm = inm; return (0); } @@ -443,7 +438,7 @@ panic("%s: ifma %p is inconsistent with %p (%s)", __func__, ifma, inm, inet_ntoa(*group)); #endif - ++inm->inm_refcount; + refcount_acquire(&inm->inm_refcount); *pinm = inm; IF_ADDR_UNLOCK(ifp); return (0); @@ -464,11 +459,12 @@ IF_ADDR_UNLOCK(ifp); return (ENOMEM); } + refcount_init(&inm->inm_refcount, 1); + inm->inm_addr = *group; inm->inm_ifp = ifp; inm->inm_igi = ii->ii_igmp; inm->inm_ifma = ifma; - inm->inm_refcount = 1; inm->inm_state = IGMP_NOT_MEMBER; /* @@ -503,11 +499,8 @@ CTR2(KTR_IGMPV3, "%s: refcount is %d", __func__, inm->inm_refcount); - if (--inm->inm_refcount > 0) { - CTR2(KTR_IGMPV3, "%s: refcount is now %d", __func__, - inm->inm_refcount); + if (refcount_release(&inm->inm_refcount) == 0) return; - } CTR2(KTR_IGMPV3, "%s: freeing inm %p", __func__, inm); Index: netinet/in_var.h =================================================================== --- netinet/in_var.h (revision 199528) +++ netinet/in_var.h (working copy) @@ -403,15 +403,6 @@ return (inm); } -/* Acquire an in_multi record. */ -static __inline void -inm_acquire_locked(struct in_multi *inm) -{ - - IN_MULTI_LOCK_ASSERT(); - ++inm->inm_refcount; -} - /* * Return values for imo_multi_filter(). */ Index: netinet/igmp.c =================================================================== --- netinet/igmp.c (revision 199528) +++ netinet/igmp.c (working copy) @@ -60,7 +60,7 @@ #include #include #include -#include +#include #include #include @@ -2579,7 +2579,7 @@ } else { int retval; - inm_acquire_locked(inm); + refcount_acquire(&inm->inm_refcount); retval = igmp_v3_enqueue_group_record( &inm->inm_scq, inm, 1, 0, 0); Index: netinet6/in6_var.h =================================================================== --- netinet6/in6_var.h (revision 199528) +++ netinet6/in6_var.h (working copy) @@ -713,15 +713,6 @@ return (inm); } -/* Acquire an in6_multi record. */ -static __inline void -in6m_acquire_locked(struct in6_multi *inm) -{ - - IN6_MULTI_LOCK_ASSERT(); - ++inm->in6m_refcount; -} - struct ip6_moptions; struct sockopt; Index: netinet6/mld6.c =================================================================== --- netinet6/mld6.c (revision 199528) +++ netinet6/mld6.c (working copy) @@ -2199,7 +2199,7 @@ } else { int retval; - in6m_acquire_locked(inm); + refcount_acquire(&inm->in6m_refcount); retval = mld_v2_enqueue_group_record( &inm->in6m_scq, inm, 1, 0, 0); Index: netinet6/in6_mcast.c =================================================================== --- netinet6/in6_mcast.c (revision 199528) +++ netinet6/in6_mcast.c (working copy) @@ -50,6 +50,7 @@ #include #include #include +#include #include #include @@ -403,13 +404,7 @@ inm = in6m_lookup_locked(ifp, group); if (inm != NULL) { - /* - * If we already joined this group, just bump the - * refcount and return it. - */ - KASSERT(inm->in6m_refcount >= 1, - ("%s: bad refcount %d", __func__, inm->in6m_refcount)); - ++inm->in6m_refcount; + refcount_acquire(&inm->in6m_refcount); *pinm = inm; goto out_locked; } @@ -449,7 +444,7 @@ panic("%s: ifma %p is inconsistent with %p (%p)", __func__, ifma, inm, group); #endif - ++inm->in6m_refcount; + refcount_acquire(&inm->in6m_refcount); *pinm = inm; goto out_locked; } @@ -470,11 +465,12 @@ error = ENOMEM; goto out_locked; } + refcount_init(&inm->in6m_refcount, 1); + inm->in6m_addr = *group; inm->in6m_ifp = ifp; inm->in6m_mli = MLD_IFINFO(ifp); inm->in6m_ifma = ifma; - inm->in6m_refcount = 1; inm->in6m_state = MLD_NOT_MEMBER; IFQ_SET_MAXLEN(&inm->in6m_scq, MLD_MAX_STATE_CHANGES); @@ -505,11 +501,8 @@ CTR2(KTR_MLD, "%s: refcount is %d", __func__, inm->in6m_refcount); - if (--inm->in6m_refcount > 0) { - CTR2(KTR_MLD, "%s: refcount is now %d", __func__, - inm->in6m_refcount); + if (refcount_release(&inm->in6m_refcount) == 0) return; - } CTR2(KTR_MLD, "%s: freeing inm %p", __func__, inm); --------------080101090006010303010009--