[PATCH] CFR: use refcount(9) in mcast
Bruce Simpson
bms at incunabulum.net
Thu Nov 19 14:46:27 UTC 2009
Look OK?
All accesses are covered by a mutex, so the atomic ops aren't really
needed -- but it makes for clearer source.
-------------- next part --------------
Index: netinet/in_mcast.c
===================================================================
--- netinet/in_mcast.c (revision 199528)
+++ netinet/in_mcast.c (working copy)
@@ -47,6 +47,7 @@
#include <sys/sysctl.h>
#include <sys/ktr.h>
#include <sys/tree.h>
+#include <sys/refcount.h>
#include <net/if.h>
#include <net/if_dl.h>
@@ -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 <sys/kernel.h>
#include <sys/sysctl.h>
#include <sys/ktr.h>
-#include <sys/condvar.h>
+#include <sys/refcount.h>
#include <net/if.h>
#include <net/netisr.h>
@@ -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 <sys/priv.h>
#include <sys/ktr.h>
#include <sys/tree.h>
+#include <sys/refcount.h>
#include <net/if.h>
#include <net/if_dl.h>
@@ -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);
More information about the freebsd-net
mailing list