Module Name: src Committed By: thorpej Date: Fri Feb 7 12:35:33 UTC 2020
Modified Files: src/sys/net: bpf.c if_stats.c net_stats.c pktqueue.c src/sys/net/npf: npf.c src/sys/netinet: wqinput.c src/sys/netipsec: key.c Log Message: Use percpu_foreach_xcall() to gather volatile per-cpu counters. These must be serialized against the interrupts / soft-interrupts in which they're manipulated, as well as protected from non-atomic 64-bit memory loads on 32-bit platforms. To generate a diff of this commit: cvs rdiff -u -r1.234 -r1.235 src/sys/net/bpf.c cvs rdiff -u -r1.1 -r1.2 src/sys/net/if_stats.c cvs rdiff -u -r1.5 -r1.6 src/sys/net/net_stats.c cvs rdiff -u -r1.10 -r1.11 src/sys/net/pktqueue.c cvs rdiff -u -r1.41 -r1.42 src/sys/net/npf/npf.c cvs rdiff -u -r1.7 -r1.8 src/sys/netinet/wqinput.c cvs rdiff -u -r1.269 -r1.270 src/sys/netipsec/key.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/bpf.c diff -u src/sys/net/bpf.c:1.234 src/sys/net/bpf.c:1.235 --- src/sys/net/bpf.c:1.234 Sat Feb 1 02:54:02 2020 +++ src/sys/net/bpf.c Fri Feb 7 12:35:33 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: bpf.c,v 1.234 2020/02/01 02:54:02 riastradh Exp $ */ +/* $NetBSD: bpf.c,v 1.235 2020/02/07 12:35:33 thorpej Exp $ */ /* * Copyright (c) 1990, 1991, 1993 @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.234 2020/02/01 02:54:02 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.235 2020/02/07 12:35:33 thorpej Exp $"); #if defined(_KERNEL_OPT) #include "opt_bpf.h" @@ -78,6 +78,7 @@ __KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.23 #include <sys/percpu.h> #include <sys/pserialize.h> #include <sys/lwp.h> +#include <sys/xcall.h> #include <net/if.h> #include <net/slip.h> @@ -2395,9 +2396,13 @@ bpf_stats(void *p, void *arg, struct cpu struct bpf_stat *const stats = p; struct bpf_stat *sum = arg; + int s = splnet(); + sum->bs_recv += stats->bs_recv; sum->bs_drop += stats->bs_drop; sum->bs_capt += stats->bs_capt; + + splx(s); } static int @@ -2410,7 +2415,8 @@ bpf_sysctl_gstats_handler(SYSCTLFN_ARGS) memset(&sum, 0, sizeof(sum)); node = *rnode; - percpu_foreach(bpf_gstats_percpu, bpf_stats, &sum); + percpu_foreach_xcall(bpf_gstats_percpu, XC_HIGHPRI_IPL(IPL_SOFTNET), + bpf_stats, &sum); node.sysctl_data = ∑ node.sysctl_size = sizeof(sum); Index: src/sys/net/if_stats.c diff -u src/sys/net/if_stats.c:1.1 src/sys/net/if_stats.c:1.2 --- src/sys/net/if_stats.c:1.1 Wed Jan 29 03:16:28 2020 +++ src/sys/net/if_stats.c Fri Feb 7 12:35:33 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_stats.c,v 1.1 2020/01/29 03:16:28 thorpej Exp $ */ +/* $NetBSD: if_stats.c,v 1.2 2020/02/07 12:35:33 thorpej Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -30,11 +30,12 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_stats.c,v 1.1 2020/01/29 03:16:28 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_stats.c,v 1.2 2020/02/07 12:35:33 thorpej Exp $"); #include <sys/param.h> #include <sys/mbuf.h> #include <sys/systm.h> +#include <sys/xcall.h> #include <net/if.h> @@ -123,7 +124,8 @@ if_stats_to_if_data(ifnet_t * const ifp, }; memset(ifi, 0, sizeof(*ifi)); - percpu_foreach(ifp->if_stats, if_stats_to_if_data_cb, &ctx); + percpu_foreach_xcall(ifp->if_stats, XC_HIGHPRI_IPL(IPL_SOFTNET), + if_stats_to_if_data_cb, &ctx); } #else /* ! __IF_STATS_PERCPU */ Index: src/sys/net/net_stats.c diff -u src/sys/net/net_stats.c:1.5 src/sys/net/net_stats.c:1.6 --- src/sys/net/net_stats.c:1.5 Thu Jun 1 02:45:14 2017 +++ src/sys/net/net_stats.c Fri Feb 7 12:35:33 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: net_stats.c,v 1.5 2017/06/01 02:45:14 chs Exp $ */ +/* $NetBSD: net_stats.c,v 1.6 2020/02/07 12:35:33 thorpej Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -30,12 +30,13 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: net_stats.c,v 1.5 2017/06/01 02:45:14 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: net_stats.c,v 1.6 2020/02/07 12:35:33 thorpej Exp $"); #include <sys/types.h> #include <sys/systm.h> #include <sys/sysctl.h> #include <sys/kmem.h> +#include <sys/xcall.h> #include <net/net_stats.h> @@ -80,7 +81,8 @@ netstat_sysctl(percpu_t *stat, u_int nco ctx.ctx_counters = counters; ctx.ctx_ncounters = ncounters; - percpu_foreach(stat, netstat_convert_to_user_cb, &ctx); + percpu_foreach_xcall(stat, XC_HIGHPRI_IPL(IPL_SOFTNET), + netstat_convert_to_user_cb, &ctx); node = *rnode; node.sysctl_data = counters; Index: src/sys/net/pktqueue.c diff -u src/sys/net/pktqueue.c:1.10 src/sys/net/pktqueue.c:1.11 --- src/sys/net/pktqueue.c:1.10 Fri Aug 10 07:24:09 2018 +++ src/sys/net/pktqueue.c Fri Feb 7 12:35:33 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pktqueue.c,v 1.10 2018/08/10 07:24:09 msaitoh Exp $ */ +/* $NetBSD: pktqueue.c,v 1.11 2020/02/07 12:35:33 thorpej Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pktqueue.c,v 1.10 2018/08/10 07:24:09 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pktqueue.c,v 1.11 2020/02/07 12:35:33 thorpej Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -48,6 +48,7 @@ __KERNEL_RCSID(0, "$NetBSD: pktqueue.c,v #include <sys/mbuf.h> #include <sys/proc.h> #include <sys/percpu.h> +#include <sys/xcall.h> #include <net/pktqueue.h> @@ -161,9 +162,13 @@ pktq_collect_counts(void *mem, void *arg const pktq_counters_t *c = mem; pktq_counters_t *sum = arg; + int s = splnet(); + for (u_int i = 0; i < PQCNT_NCOUNTERS; i++) { sum->count[i] += c->count[i]; } + + splx(s); } uint64_t @@ -173,7 +178,8 @@ pktq_get_count(pktqueue_t *pq, pktq_coun if (c != PKTQ_MAXLEN) { memset(&sum, 0, sizeof(sum)); - percpu_foreach(pq->pq_counters, pktq_collect_counts, &sum); + percpu_foreach_xcall(pq->pq_counters, + XC_HIGHPRI_IPL(IPL_SOFTNET), pktq_collect_counts, &sum); } switch (c) { case PKTQ_NITEMS: Index: src/sys/net/npf/npf.c diff -u src/sys/net/npf/npf.c:1.41 src/sys/net/npf/npf.c:1.42 --- src/sys/net/npf/npf.c:1.41 Sun Aug 25 13:21:03 2019 +++ src/sys/net/npf/npf.c Fri Feb 7 12:35:33 2020 @@ -33,7 +33,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.41 2019/08/25 13:21:03 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.42 2020/02/07 12:35:33 thorpej Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -41,6 +41,7 @@ __KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.41 #include <sys/conf.h> #include <sys/kmem.h> #include <sys/percpu.h> +#include <sys/xcall.h> #endif #include "npf_impl.h" @@ -201,11 +202,13 @@ __dso_public void npfk_stats(npf_t *npf, uint64_t *buf) { memset(buf, 0, NPF_STATS_SIZE); - percpu_foreach(npf->stats_percpu, npf_stats_collect, buf); + percpu_foreach_xcall(npf->stats_percpu, XC_HIGHPRI_IPL(IPL_SOFTNET), + npf_stats_collect, buf); } __dso_public void npfk_stats_clear(npf_t *npf) { - percpu_foreach(npf->stats_percpu, npf_stats_clear_cb, NULL); + percpu_foreach_xcall(npf->stats_percpu, XC_HIGHPRI_IPL(IPL_SOFTNET), + npf_stats_clear_cb, NULL); } Index: src/sys/netinet/wqinput.c diff -u src/sys/netinet/wqinput.c:1.7 src/sys/netinet/wqinput.c:1.8 --- src/sys/netinet/wqinput.c:1.7 Sat Feb 1 12:54:51 2020 +++ src/sys/netinet/wqinput.c Fri Feb 7 12:35:33 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: wqinput.c,v 1.7 2020/02/01 12:54:51 riastradh Exp $ */ +/* $NetBSD: wqinput.c,v 1.8 2020/02/07 12:35:33 thorpej Exp $ */ /*- * Copyright (c) 2017 Internet Initiative Japan Inc. @@ -41,6 +41,7 @@ #include <sys/queue.h> #include <sys/percpu.h> #include <sys/sysctl.h> +#include <sys/xcall.h> #include <net/if.h> #include <netinet/wqinput.h> @@ -98,7 +99,8 @@ wqinput_sysctl_drops_handler(SYSCTLFN_AR node = *rnode; wqi = node.sysctl_data; - percpu_foreach(wqi->wqi_worklists, wqinput_drops, &sum); + percpu_foreach_xcall(wqi->wqi_worklists, XC_HIGHPRI_IPL(IPL_SOFTNET), + wqinput_drops, &sum); node.sysctl_data = ∑ error = sysctl_lookup(SYSCTLFN_CALL(&node)); Index: src/sys/netipsec/key.c diff -u src/sys/netipsec/key.c:1.269 src/sys/netipsec/key.c:1.270 --- src/sys/netipsec/key.c:1.269 Thu Nov 14 03:17:08 2019 +++ src/sys/netipsec/key.c Fri Feb 7 12:35:33 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: key.c,v 1.269 2019/11/14 03:17:08 knakahara Exp $ */ +/* $NetBSD: key.c,v 1.270 2020/02/07 12:35:33 thorpej Exp $ */ /* $FreeBSD: key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $ */ /* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */ @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.269 2019/11/14 03:17:08 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.270 2020/02/07 12:35:33 thorpej Exp $"); /* * This code is referred to RFC 2367 @@ -73,6 +73,7 @@ __KERNEL_RCSID(0, "$NetBSD: key.c,v 1.26 #include <sys/localcount.h> #include <sys/pserialize.h> #include <sys/hash.h> +#include <sys/xcall.h> #include <net/if.h> #include <net/route.h> @@ -3961,7 +3962,8 @@ key_setdumpsa(struct secasvar *sav, u_in time_mono_to_wall(lt.sadb_lifetime_addtime); lt.sadb_lifetime_usetime = time_mono_to_wall(lt.sadb_lifetime_usetime); - percpu_foreach(sav->lft_c_counters_percpu, + percpu_foreach_xcall(sav->lft_c_counters_percpu, + XC_HIGHPRI_IPL(IPL_SOFTNET), key_sum_lifetime_counters, sum); lt.sadb_lifetime_allocations = sum[LIFETIME_COUNTER_ALLOCATIONS]; @@ -5027,7 +5029,8 @@ restart: uint64_t lft_c_bytes = 0; lifetime_counters_t sum = {0}; - percpu_foreach(sav->lft_c_counters_percpu, + percpu_foreach_xcall(sav->lft_c_counters_percpu, + XC_HIGHPRI_IPL(IPL_SOFTNET), key_sum_lifetime_counters, sum); lft_c_bytes = sum[LIFETIME_COUNTER_BYTES]; @@ -5089,7 +5092,8 @@ restart: uint64_t lft_c_bytes = 0; lifetime_counters_t sum = {0}; - percpu_foreach(sav->lft_c_counters_percpu, + percpu_foreach_xcall(sav->lft_c_counters_percpu, + XC_HIGHPRI_IPL(IPL_SOFTNET), key_sum_lifetime_counters, sum); lft_c_bytes = sum[LIFETIME_COUNTER_BYTES]; @@ -7425,8 +7429,8 @@ key_expire(struct secasvar *sav) lt = mtod(m, struct sadb_lifetime *); lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime)); lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT; - percpu_foreach(sav->lft_c_counters_percpu, - key_sum_lifetime_counters, sum); + percpu_foreach_xcall(sav->lft_c_counters_percpu, + XC_HIGHPRI_IPL(IPL_SOFTNET), key_sum_lifetime_counters, sum); lt->sadb_lifetime_allocations = sum[LIFETIME_COUNTER_ALLOCATIONS]; lt->sadb_lifetime_bytes = sum[LIFETIME_COUNTER_BYTES]; lt->sadb_lifetime_addtime =