Module Name: src
Committed By: riastradh
Date: Thu Feb 23 14:55:47 UTC 2023
Modified Files:
src/sys/arch/ia64/ia64: machdep.c vm_machdep.c
Log Message:
ia64: Add missing barriers in cpu_switchto.
(ia64 has never really worked, so no pullups needed, right?)
PR kern/57240
To generate a diff of this commit:
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/ia64/ia64/machdep.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/ia64/ia64/vm_machdep.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/arch/ia64/ia64/machdep.c
diff -u src/sys/arch/ia64/ia64/machdep.c:1.43 src/sys/arch/ia64/ia64/machdep.c:1.44
--- src/sys/arch/ia64/ia64/machdep.c:1.43 Fri Apr 19 16:28:32 2019
+++ src/sys/arch/ia64/ia64/machdep.c Thu Feb 23 14:55:47 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.43 2019/04/19 16:28:32 scole Exp $ */
+/* $NetBSD: machdep.c,v 1.44 2023/02/23 14:55:47 riastradh Exp $ */
/*-
* Copyright (c) 2003,2004 Marcel Moolenaar
@@ -638,6 +638,10 @@ ia64_init(void)
/*
* Initialise process context. XXX: This should really be in cpu_switchto
+ *
+ * No membar needed because we're not switching from a
+ * previous lwp, and the idle lwp we're switching to can't be
+ * holding locks already; see cpu_switchto.
*/
ci->ci_curlwp = &lwp0;
Index: src/sys/arch/ia64/ia64/vm_machdep.c
diff -u src/sys/arch/ia64/ia64/vm_machdep.c:1.17 src/sys/arch/ia64/ia64/vm_machdep.c:1.18
--- src/sys/arch/ia64/ia64/vm_machdep.c:1.17 Sat Jan 1 21:07:14 2022
+++ src/sys/arch/ia64/ia64/vm_machdep.c Thu Feb 23 14:55:47 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.17 2022/01/01 21:07:14 andvar Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.18 2023/02/23 14:55:47 riastradh Exp $ */
/*
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -37,6 +37,7 @@
#include <sys/proc.h>
#include <sys/systm.h>
#include <sys/cpu.h>
+#include <sys/atomic.h>
#include <machine/frame.h>
#include <machine/md_var.h>
@@ -77,9 +78,29 @@ cpu_switchto(lwp_t *oldlwp, lwp_t *newlw
register uint64_t reg9 __asm("r9");
KASSERT(newlwp != NULL);
-
+
+ /*
+ * 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.
+ */
+ membar_producer(); /* store-before-store */
ci->ci_curlwp = newlwp;
-
+ membar_sync(); /* store-before-load */
+
/* required for lwp_startup, copy oldlwp into r9, "mov r9=in0" */
__asm __volatile("mov %0=%1" : "=r"(reg9) : "r"(oldlwp));