Backout always allocate per-CPU statistics counters for network
authorbluhm <bluhm@openbsd.org>
Sat, 23 Dec 2023 10:52:54 +0000 (10:52 +0000)
committerbluhm <bluhm@openbsd.org>
Sat, 23 Dec 2023 10:52:54 +0000 (10:52 +0000)
interface descriptor.  It panics during attach of em(4) device at
boot.

22 files changed:
sys/net/if.c
sys/net/if_aggr.c
sys/net/if_bpe.c
sys/net/if_etherip.c
sys/net/if_gif.c
sys/net/if_gre.c
sys/net/if_mpe.c
sys/net/if_mpip.c
sys/net/if_mpw.c
sys/net/if_pflow.c
sys/net/if_pfsync.c
sys/net/if_pppx.c
sys/net/if_sec.c
sys/net/if_tpmr.c
sys/net/if_trunk.c
sys/net/if_tun.c
sys/net/if_var.h
sys/net/if_veb.c
sys/net/if_vlan.c
sys/net/if_vxlan.c
sys/net/if_wg.c
sys/netinet/ip_carp.c

index f205a67..61c24af 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if.c,v 1.712 2023/12/22 23:01:50 mvs Exp $    */
+/*     $OpenBSD: if.c,v 1.713 2023/12/23 10:52:54 bluhm Exp $  */
 /*     $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $  */
 
 /*
@@ -645,8 +645,6 @@ if_attach_common(struct ifnet *ifp)
                    "%s: if_qstart not set with MPSAFE set", ifp->if_xname);
        }
 
-       ifp->if_counters = counters_alloc(ifc_ncounters);
-
        if_idxmap_alloc(ifp);
 
        ifq_init(&ifp->if_snd, ifp, 0);
@@ -1252,7 +1250,8 @@ if_detach(struct ifnet *ifp)
        /* Announce that the interface is gone. */
        rtm_ifannounce(ifp, IFAN_DEPARTURE);
 
-       counters_free(ifp->if_counters, ifc_ncounters);
+       if (ifp->if_counters != NULL)
+               if_counters_free(ifp);
 
        for (i = 0; i < ifp->if_nifqs; i++)
                ifq_destroy(ifp->if_ifqs[i]);
@@ -2771,28 +2770,49 @@ ifconf(caddr_t data)
        return (error);
 }
 
+void
+if_counters_alloc(struct ifnet *ifp)
+{
+       KASSERT(ifp->if_counters == NULL);
+
+       ifp->if_counters = counters_alloc(ifc_ncounters);
+}
+
+void
+if_counters_free(struct ifnet *ifp)
+{
+       KASSERT(ifp->if_counters != NULL);
+
+       counters_free(ifp->if_counters, ifc_ncounters);
+       ifp->if_counters = NULL;
+}
+
 void
 if_getdata(struct ifnet *ifp, struct if_data *data)
 {
-       uint64_t counters[ifc_ncounters];
        unsigned int i;
 
        *data = ifp->if_data;
 
-       counters_read(ifp->if_counters, counters, nitems(counters), NULL);
-
-       data->ifi_ipackets += counters[ifc_ipackets];
-       data->ifi_ierrors += counters[ifc_ierrors];
-       data->ifi_opackets += counters[ifc_opackets];
-       data->ifi_oerrors += counters[ifc_oerrors];
-       data->ifi_collisions += counters[ifc_collisions];
-       data->ifi_ibytes += counters[ifc_ibytes];
-       data->ifi_obytes += counters[ifc_obytes];
-       data->ifi_imcasts += counters[ifc_imcasts];
-       data->ifi_omcasts += counters[ifc_omcasts];
-       data->ifi_iqdrops += counters[ifc_iqdrops];
-       data->ifi_oqdrops += counters[ifc_oqdrops];
-       data->ifi_noproto += counters[ifc_noproto];
+       if (ifp->if_counters != NULL) {
+               uint64_t counters[ifc_ncounters];
+
+               counters_read(ifp->if_counters, counters, nitems(counters),
+                   NULL);
+
+               data->ifi_ipackets += counters[ifc_ipackets];
+               data->ifi_ierrors += counters[ifc_ierrors];
+               data->ifi_opackets += counters[ifc_opackets];
+               data->ifi_oerrors += counters[ifc_oerrors];
+               data->ifi_collisions += counters[ifc_collisions];
+               data->ifi_ibytes += counters[ifc_ibytes];
+               data->ifi_obytes += counters[ifc_obytes];
+               data->ifi_imcasts += counters[ifc_imcasts];
+               data->ifi_omcasts += counters[ifc_omcasts];
+               data->ifi_iqdrops += counters[ifc_iqdrops];
+               data->ifi_oqdrops += counters[ifc_oqdrops];
+               data->ifi_noproto += counters[ifc_noproto];
+       }
 
        for (i = 0; i < ifp->if_nifqs; i++) {
                struct ifqueue *ifq = ifp->if_ifqs[i];
index 5536e07..8e961b4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_aggr.c,v 1.41 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_aggr.c,v 1.42 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2019 The University of Queensland
@@ -562,6 +562,7 @@ aggr_clone_create(struct if_clone *ifc, int unit)
        ifp->if_link_state = LINK_STATE_DOWN;
        ether_fakeaddr(ifp);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
index f5d4771..cee69c9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_bpe.c,v 1.21 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_bpe.c,v 1.22 2023/12/23 10:52:54 bluhm Exp $ */
 /*
  * Copyright (c) 2018 David Gwynne <dlg@openbsd.org>
  *
@@ -182,6 +182,7 @@ bpe_clone_create(struct if_clone *ifc, int unit)
        ifp->if_xflags = IFXF_CLONED;
        ether_fakeaddr(ifp);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
index 2773685..653371f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_etherip.c,v 1.53 2023/12/22 23:01:50 mvs Exp $     */
+/*     $OpenBSD: if_etherip.c,v 1.54 2023/12/23 10:52:54 bluhm Exp $   */
 /*
  * Copyright (c) 2015 Kazuya GODA <goda@openbsd.org>
  *
@@ -161,6 +161,7 @@ etherip_clone_create(struct if_clone *ifc, int unit)
        ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_AUTO, 0, NULL);
        ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
index 1051247..4aa1cc7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_gif.c,v 1.135 2023/12/22 23:01:50 mvs Exp $        */
+/*     $OpenBSD: if_gif.c,v 1.136 2023/12/23 10:52:54 bluhm Exp $      */
 /*     $KAME: if_gif.c,v 1.43 2001/02/20 08:51:07 itojun Exp $ */
 
 /*
@@ -176,6 +176,7 @@ gif_clone_create(struct if_clone *ifc, int unit)
 
        if_attach(ifp);
        if_alloc_sadl(ifp);
+       if_counters_alloc(ifp);
 
 #if NBPFILTER > 0
        bpfattach(&ifp->if_bpf, ifp, DLT_LOOP, sizeof(uint32_t));
index 967cb75..94f3d89 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_gre.c,v 1.177 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_gre.c,v 1.178 2023/12/23 10:52:54 bluhm Exp $ */
 /*     $NetBSD: if_gre.c,v 1.9 1999/10/25 19:18:11 drochner Exp $ */
 
 /*
@@ -592,6 +592,7 @@ gre_clone_create(struct if_clone *ifc, int unit)
        timeout_set_proc(&sc->sc_ka_hold, gre_keepalive_hold, sc);
        sc->sc_ka_state = GRE_KA_NONE;
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        if_alloc_sadl(ifp);
 
@@ -658,6 +659,7 @@ mgre_clone_create(struct if_clone *ifc, int unit)
        sc->sc_tunnel.t_df = htons(0);
        sc->sc_tunnel.t_ecn = ECN_ALLOWED;
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        if_alloc_sadl(ifp);
 
@@ -714,6 +716,7 @@ egre_clone_create(struct if_clone *ifc, int unit)
        ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_AUTO, 0, NULL);
        ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
@@ -791,6 +794,7 @@ nvgre_clone_create(struct if_clone *ifc, int unit)
        ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_AUTO, 0, NULL);
        ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
@@ -854,6 +858,7 @@ eoip_clone_create(struct if_clone *ifc, int unit)
        ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_AUTO, 0, NULL);
        ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
index 447570b..a72347b 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_mpe.c,v 1.103 2023/12/22 23:01:50 mvs Exp $ */
+/* $OpenBSD: if_mpe.c,v 1.104 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@spootnik.org>
@@ -119,6 +119,7 @@ mpe_clone_create(struct if_clone *ifc, int unit)
 
        if_attach(ifp);
        if_alloc_sadl(ifp);
+       if_counters_alloc(ifp);
 
 #if NBPFILTER > 0
        bpfattach(&ifp->if_bpf, ifp, DLT_LOOP, sizeof(u_int32_t));
index d0c3971..8daac93 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_mpip.c,v 1.17 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_mpip.c,v 1.18 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2015 Rafael Zalamena <rzalamena@openbsd.org>
@@ -121,6 +121,7 @@ mpip_clone_create(struct if_clone *ifc, int unit)
        ifp->if_hardmtu = 65535;
 
        if_attach(ifp);
+       if_counters_alloc(ifp);
        if_alloc_sadl(ifp);
 
 #if NBPFILTER > 0
index 2229bcf..934a757 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_mpw.c,v 1.64 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_mpw.c,v 1.65 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2015 Rafael Zalamena <rzalamena@openbsd.org>
@@ -115,6 +115,7 @@ mpw_clone_create(struct if_clone *ifc, int unit)
 
        sc->sc_dead = 0;
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
index 79c0f2f..09a2689 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_pflow.c,v 1.108 2023/12/22 23:01:50 mvs Exp $      */
+/*     $OpenBSD: if_pflow.c,v 1.109 2023/12/23 10:52:54 bluhm Exp $    */
 
 /*
  * Copyright (c) 2011 Florian Obser <florian@narrans.de>
@@ -279,6 +279,7 @@ pflow_clone_create(struct if_clone *ifc, int unit)
 
        task_set(&pflowif->sc_outputtask, pflow_output_process, pflowif);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        if_alloc_sadl(ifp);
 
index 86664de..748020f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_pfsync.c,v 1.323 2023/12/22 23:01:50 mvs Exp $     */
+/*     $OpenBSD: if_pfsync.c,v 1.324 2023/12/23 10:52:54 bluhm Exp $   */
 
 /*
  * Copyright (c) 2002 Michael Shalayeff
@@ -444,6 +444,7 @@ pfsync_clone_create(struct if_clone *ifc, int unit)
 #endif
        }
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        if_alloc_sadl(ifp);
 
index 71d302d..35dbec5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_pppx.c,v 1.127 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_pppx.c,v 1.128 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2010 Claudio Jeker <claudio@openbsd.org>
@@ -684,6 +684,7 @@ pppx_add_session(struct pppx_dev *pxd, struct pipex_session_req *req)
        ifp->if_type = IFT_PPP;
        ifp->if_softc = pxi;
        /* ifp->if_rdomain = req->pr_rdomain; */
+       if_counters_alloc(ifp);
 
        if_attach(ifp);
 
@@ -1079,6 +1080,7 @@ pppacopen(dev_t dev, int flags, int mode, struct proc *p)
        ifp->if_qstart = pppac_qstart;
        ifp->if_ioctl = pppac_ioctl;
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        if_alloc_sadl(ifp);
 
index a7e85d9..99e79b5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_sec.c,v 1.8 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_sec.c,v 1.9 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2022 The University of Queensland
@@ -147,6 +147,7 @@ sec_clone_create(struct if_clone *ifc, int unit)
        ifp->if_ioctl = sec_ioctl;
        ifp->if_rtrequest = p2p_rtrequest;
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        if_alloc_sadl(ifp);
 
index 7794dfb..11f5634 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_tpmr.c,v 1.34 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_tpmr.c,v 1.35 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2019 The University of Queensland
@@ -168,6 +168,7 @@ tpmr_clone_create(struct if_clone *ifc, int unit)
        ifp->if_xflags = IFXF_CLONED | IFXF_MPSAFE;
        ifp->if_link_state = LINK_STATE_DOWN;
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        if_alloc_sadl(ifp);
 
index be43be6..c1268f2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_trunk.c,v 1.153 2023/12/22 23:01:50 mvs Exp $      */
+/*     $OpenBSD: if_trunk.c,v 1.154 2023/12/23 10:52:54 bluhm Exp $    */
 
 /*
  * Copyright (c) 2005, 2006, 2007 Reyk Floeter <reyk@openbsd.org>
@@ -193,6 +193,7 @@ trunk_clone_create(struct if_clone *ifc, int unit)
         * Attach as an ordinary ethernet device, children will be attached
         * as special device IFT_IEEE8023ADLAG.
         */
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
index b4780f1..246a300 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_tun.c,v 1.239 2023/12/22 23:01:50 mvs Exp $        */
+/*     $OpenBSD: if_tun.c,v 1.240 2023/12/23 10:52:54 bluhm Exp $      */
 /*     $NetBSD: if_tun.c,v 1.24 1996/05/07 02:40:48 thorpej Exp $      */
 
 /*
@@ -246,6 +246,8 @@ tun_create(struct if_clone *ifc, int unit, int flags)
        ifp->if_hardmtu = TUNMRU;
        ifp->if_link_state = LINK_STATE_DOWN;
 
+       if_counters_alloc(ifp);
+
        if ((flags & TUN_LAYER2) == 0) {
 #if NBPFILTER > 0
                ifp->if_bpf_mtap = bpf_mtap;
index 38528b2..db48e5f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_var.h,v 1.131 2023/12/22 23:01:50 mvs Exp $        */
+/*     $OpenBSD: if_var.h,v 1.132 2023/12/23 10:52:54 bluhm Exp $      */
 /*     $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $  */
 
 /*
@@ -379,6 +379,9 @@ int if_rxr_info_ioctl(struct if_rxrinfo *, u_int, struct if_rxring_info *);
 int    if_rxr_ioctl(struct if_rxrinfo *, const char *, u_int,
            struct if_rxring *);
 
+void   if_counters_alloc(struct ifnet *);
+void   if_counters_free(struct ifnet *);
+
 int    if_txhprio_l2_check(int);
 int    if_txhprio_l3_check(int);
 int    if_rxhprio_l2_check(int);
index 6c1c578..e6cdf6b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_veb.c,v 1.33 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_veb.c,v 1.34 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2021 David Gwynne <dlg@openbsd.org>
@@ -314,6 +314,7 @@ veb_clone_create(struct if_clone *ifc, int unit)
        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
        ifp->if_xflags = IFXF_CLONED | IFXF_MPSAFE;
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
 
        if_alloc_sadl(ifp);
@@ -2347,6 +2348,7 @@ vport_clone_create(struct if_clone *ifc, int unit)
        ifp->if_xflags = IFXF_CLONED | IFXF_MPSAFE;
        ether_fakeaddr(ifp);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
index 1246c8c..9915a94 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_vlan.c,v 1.217 2023/12/22 23:01:50 mvs Exp $       */
+/*     $OpenBSD: if_vlan.c,v 1.218 2023/12/23 10:52:54 bluhm Exp $     */
 
 /*
  * Copyright 1998 Massachusetts Institute of Technology
@@ -215,6 +215,7 @@ vlan_clone_create(struct if_clone *ifc, int unit)
        ifp->if_hardmtu = 0xffff;
        ifp->if_link_state = LINK_STATE_DOWN;
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
        ifp->if_hdrlen = EVL_ENCAPLEN;
index 2889dce..ec9339d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_vxlan.c,v 1.98 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_vxlan.c,v 1.99 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (c) 2021 David Gwynne <dlg@openbsd.org>
@@ -275,6 +275,7 @@ vxlan_clone_create(struct if_clone *ifc, int unit)
        ifp->if_xflags = IFXF_CLONED | IFXF_MPSAFE;
        ether_fakeaddr(ifp);
 
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
 
index 5752aa4..a55fba2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_wg.c,v 1.33 2023/12/22 23:01:50 mvs Exp $ */
+/*     $OpenBSD: if_wg.c,v 1.34 2023/12/23 10:52:54 bluhm Exp $ */
 
 /*
  * Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
@@ -2693,6 +2693,7 @@ wg_clone_create(struct if_clone *ifc, int unit)
 
        if_attach(ifp);
        if_alloc_sadl(ifp);
+       if_counters_alloc(ifp);
 
 #if NBPFILTER > 0
        bpfattach(&ifp->if_bpf, ifp, DLT_LOOP, sizeof(uint32_t));
index 4a843fe..f2aee3e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip_carp.c,v 1.359 2023/12/22 23:01:50 mvs Exp $       */
+/*     $OpenBSD: ip_carp.c,v 1.360 2023/12/23 10:52:54 bluhm Exp $     */
 
 /*
  * Copyright (c) 2002 Michael Shalayeff. All rights reserved.
@@ -831,6 +831,7 @@ carp_clone_create(struct if_clone *ifc, int unit)
        ifp->if_start = carp_start;
        ifp->if_enqueue = carp_enqueue;
        ifp->if_xflags = IFXF_CLONED;
+       if_counters_alloc(ifp);
        if_attach(ifp);
        ether_ifattach(ifp);
        ifp->if_type = IFT_CARP;