Hi, Inspired by Taylor's talk at EuroBSDCon I think a memory barrier in counters_zero() is missing. Reading uses two consumer barriers, so writing should also have two.
Following code would have no barrier between writing generation number and writing counters. counters_leave(); counters_zero(); counters_leave() writes to generation number at the end, so counters_zero() needs a barrier at the start. ok? bluhm Index: kern/subr_percpu.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/kern/subr_percpu.c,v retrieving revision 1.9 diff -u -p -r1.9 subr_percpu.c --- kern/subr_percpu.c 10 Mar 2021 10:21:47 -0000 1.9 +++ kern/subr_percpu.c 17 Sep 2022 14:17:34 -0000 @@ -213,6 +213,7 @@ counters_zero(struct cpumem *cm, unsigne unsigned int i; counters = cpumem_first(&cmi, cm); + membar_producer(); do { for (i = 0; i < n; i++) counters[i] = 0;