use refcnt API for multicast addresses, add tracepoint:refcnt:ifmaddr probe
authorkn <kn@openbsd.org>
Wed, 28 Jun 2023 11:49:49 +0000 (11:49 +0000)
committerkn <kn@openbsd.org>
Wed, 28 Jun 2023 11:49:49 +0000 (11:49 +0000)
Replace hand-rolled reference counting with refcnt_init(9) and hook it up
with a new dt(4) probe.

OK bluhm mvs

sys/dev/dt/dt_prov_static.c
sys/net/if_var.h
sys/netinet/in.c
sys/netinet6/in6.c
sys/sys/refcnt.h

index 5bd926d..e446844 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dt_prov_static.c,v 1.18 2023/04/28 20:03:13 mvs Exp $ */
+/*     $OpenBSD: dt_prov_static.c,v 1.19 2023/06/28 11:49:49 kn Exp $ */
 
 /*
  * Copyright (c) 2019 Martin Pieuchot <mpi@openbsd.org>
@@ -93,6 +93,7 @@ DT_STATIC_PROBE2(smr, thread, "uint64_t", "uint64_t");
  */
 DT_STATIC_PROBE0(refcnt, none);
 DT_STATIC_PROBE3(refcnt, ifaddr, "void *", "int", "int");
+DT_STATIC_PROBE3(refcnt, ifmaddr, "void *", "int", "int");
 DT_STATIC_PROBE3(refcnt, inpcb, "void *", "int", "int");
 DT_STATIC_PROBE3(refcnt, rtentry, "void *", "int", "int");
 DT_STATIC_PROBE3(refcnt, tdb, "void *", "int", "int");
@@ -140,6 +141,7 @@ struct dt_probe *const dtps_static[] = {
        /* refcnt */
        &_DT_STATIC_P(refcnt, none),
        &_DT_STATIC_P(refcnt, ifaddr),
+       &_DT_STATIC_P(refcnt, ifmaddr),
        &_DT_STATIC_P(refcnt, inpcb),
        &_DT_STATIC_P(refcnt, rtentry),
        &_DT_STATIC_P(refcnt, tdb),
index 4152d3a..a4eabc5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_var.h,v 1.127 2023/05/30 08:30:01 jsg Exp $        */
+/*     $OpenBSD: if_var.h,v 1.128 2023/06/28 11:49:49 kn Exp $ */
 /*     $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $  */
 
 /*
@@ -255,7 +255,7 @@ struct ifaddr {
 struct ifmaddr {
        struct sockaddr         *ifma_addr;     /* Protocol address */
        unsigned int             ifma_ifidx;    /* Index of the interface */
-       unsigned int             ifma_refcnt;   /* Count of references */
+       struct refcnt            ifma_refcnt;   /* Count of references */
        TAILQ_ENTRY(ifmaddr)     ifma_list;     /* Per-interface list */
 };
 
index 624c67d..d2207b3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in.c,v 1.184 2023/04/24 12:11:56 kn Exp $     */
+/*     $OpenBSD: in.c,v 1.185 2023/06/28 11:49:49 kn Exp $     */
 /*     $NetBSD: in.c,v 1.26 1996/02/13 23:41:39 christos Exp $ */
 
 /*
@@ -839,7 +839,7 @@ in_addmulti(struct in_addr *ap, struct ifnet *ifp)
                /*
                 * Found it; just increment the reference count.
                 */
-               ++inm->inm_refcnt;
+               refcnt_take(&inm->inm_refcnt);
        } else {
                /*
                 * New address; allocate a new multicast record
@@ -849,7 +849,7 @@ in_addmulti(struct in_addr *ap, struct ifnet *ifp)
                inm->inm_sin.sin_len = sizeof(struct sockaddr_in);
                inm->inm_sin.sin_family = AF_INET;
                inm->inm_sin.sin_addr = *ap;
-               inm->inm_refcnt = 1;
+               refcnt_init_trace(&inm->inm_refcnt, DT_REFCNT_IDX_IFMADDR);
                inm->inm_ifidx = ifp->if_index;
                inm->inm_ifma.ifma_addr = sintosa(&inm->inm_sin);
 
@@ -890,7 +890,7 @@ in_delmulti(struct in_multi *inm)
 
        NET_ASSERT_LOCKED();
 
-       if (--inm->inm_refcnt != 0)
+       if (refcnt_rele(&inm->inm_refcnt) == 0)
                return;
 
        ifp = if_get(inm->inm_ifidx);
index 3651a5f..1266354 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in6.c,v 1.261 2023/04/21 00:41:13 kn Exp $    */
+/*     $OpenBSD: in6.c,v 1.262 2023/06/28 11:49:49 kn Exp $    */
 /*     $KAME: in6.c,v 1.372 2004/06/14 08:14:21 itojun Exp $   */
 
 /*
@@ -1032,7 +1032,7 @@ in6_addmulti(struct in6_addr *maddr6, struct ifnet *ifp, int *errorp)
                /*
                 * Found it; just increment the reference count.
                 */
-               in6m->in6m_refcnt++;
+               refcnt_take(&in6m->in6m_refcnt);
        } else {
                /*
                 * New address; allocate a new multicast record
@@ -1047,7 +1047,7 @@ in6_addmulti(struct in6_addr *maddr6, struct ifnet *ifp, int *errorp)
                in6m->in6m_sin.sin6_len = sizeof(struct sockaddr_in6);
                in6m->in6m_sin.sin6_family = AF_INET6;
                in6m->in6m_sin.sin6_addr = *maddr6;
-               in6m->in6m_refcnt = 1;
+               refcnt_init_trace(&in6m->in6m_refcnt, DT_REFCNT_IDX_IFMADDR);
                in6m->in6m_ifidx = ifp->if_index;
                in6m->in6m_ifma.ifma_addr = sin6tosa(&in6m->in6m_sin);
 
@@ -1088,7 +1088,7 @@ in6_delmulti(struct in6_multi *in6m)
 
        NET_ASSERT_LOCKED();
 
-       if (--in6m->in6m_refcnt == 0) {
+       if (refcnt_rele(&in6m->in6m_refcnt) != 0) {
                /*
                 * No remaining claims to this record; let MLD6 know
                 * that we are leaving the multicast group.
index 4479738..47a40f6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: refcnt.h,v 1.9 2023/04/28 20:03:14 mvs Exp $ */
+/*     $OpenBSD: refcnt.h,v 1.10 2023/06/28 11:49:49 kn Exp $ */
 
 /*
  * Copyright (c) 2015 David Gwynne <dlg@openbsd.org>
@@ -45,9 +45,10 @@ unsigned int refcnt_read(struct refcnt *);
 
 /* sorted alphabetically, keep in sync with dev/dt/dt_prov_static.c */
 #define DT_REFCNT_IDX_IFADDR   1
-#define DT_REFCNT_IDX_INPCB    2
-#define DT_REFCNT_IDX_RTENTRY  3
-#define DT_REFCNT_IDX_TDB      4
+#define DT_REFCNT_IDX_IFMADDR  2
+#define DT_REFCNT_IDX_INPCB    3
+#define DT_REFCNT_IDX_RTENTRY  4
+#define DT_REFCNT_IDX_TDB      5
 
 #endif /* _KERNEL */