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;