Module Name: src
Committed By: riastradh
Date: Thu Feb 23 14:57:09 UTC 2023
Modified Files:
src/sys/arch/vax/vax: subr.S
Log Message:
vax: Note where cpu_switchto needs barriers.
PR kern/57240
Not sure vax has ever had working MULTIPROCESSOR, though, and I'm not
even sure how to spell store-before-load barriers on VAX, so no
functional change for now.
To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/arch/vax/vax/subr.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/vax/vax/subr.S
diff -u src/sys/arch/vax/vax/subr.S:1.41 src/sys/arch/vax/vax/subr.S:1.42
--- src/sys/arch/vax/vax/subr.S:1.41 Mon Oct 31 20:30:23 2022
+++ src/sys/arch/vax/vax/subr.S Thu Feb 23 14:57:08 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: subr.S,v 1.41 2022/10/31 20:30:23 andvar Exp $ */
+/* $NetBSD: subr.S,v 1.42 2023/02/23 14:57:08 riastradh Exp $ */
/*
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
@@ -315,7 +315,9 @@ softint_process:
movab softint_exit,PCB_PC(%r3)/* do a quick exit */
#ifdef MULTIPROCESSOR
movl L_CPU(%r6),%r8
+ /* XXX store-before-store barrier -- see cpu_switchto */
movl %r6,CI_CURLWP(%r8)
+ /* XXX store-before-load barrier -- see cpu_switchto */
#endif
mtpr PCB_PADDR(%r3),$PR_PCBB /* restore PA of interrupted pcb */
@@ -338,7 +340,9 @@ softint_common:
movl %r6,PCB_R6(%r3) /* move old lwp into new pcb */
movl %r1,PCB_R7(%r3) /* move IPL into new pcb */
#ifdef MULTIPROCESSOR
+ /* XXX store-before-store barrier -- see cpu_switchto */
movl %r2,CI_CURLWP(%r8) /* update ci_curlwp */
+ /* XXX store-before-load barrier -- see cpu_switchto */
#endif
/*
@@ -404,7 +408,31 @@ JSBENTRY(Swtchto)
#ifdef MULTIPROCESSOR
movl L_CPU(%r0), %r8 /* get cpu_info of old lwp */
movl %r8, L_CPU(%r1) /* update cpu_info of new lwp */
+ /*
+ * Issue barriers to coordinate mutex_exit on this CPU with
+ * mutex_vector_enter on another CPU.
+ *
+ * 1. Any prior mutex_exit by oldlwp must be visible to other
+ * CPUs before we set ci_curlwp := newlwp on this one,
+ * requiring a store-before-store barrier.
+ *
+ * 2. ci_curlwp := newlwp must be visible on all other CPUs
+ * before any subsequent mutex_exit by newlwp can even test
+ * whether there might be waiters, requiring a
+ * store-before-load barrier.
+ *
+ * See kern_mutex.c for details -- this is necessary for
+ * adaptive mutexes to detect whether the lwp is on the CPU in
+ * order to safely block without requiring atomic r/m/w in
+ * mutex_exit.
+ *
+ * XXX I'm fuzzy on the memory model of VAX. I would guess
+ * it's TSO like x86 but I can't find a store-before-load
+ * barrier, which is the only one TSO requires explicitly.
+ */
+ /* XXX store-before-store barrier */
movl %r1,CI_CURLWP(%r8) /* update ci_curlwp */
+ /* XXX store-before-load barrier */
#endif
mtpr PCB_PADDR(%r3),$PR_PCBB # set PA of new pcb