git: 0700107b4b7c - stable/14 - dtrace: Add compiler barriers around updates to per-CPU flags

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Fri, 20 Jun 2025 13:52:24 UTC
The branch stable/14 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=0700107b4b7c7fcb858b5ed70a85d64bcb75d7cd

commit 0700107b4b7c7fcb858b5ed70a85d64bcb75d7cd
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2025-05-28 20:45:27 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-06-20 12:46:09 +0000

    dtrace: Add compiler barriers around updates to per-CPU flags
    
    Otherwise there's nothing preventing reordering of memory accesses with
    respect to these flags being set or cleared.  Since their most common
    use is to create a section in dtrace probe context where memory faults
    are intercepted by dtrace_trap(), such reordering can turn dtrace errors
    into fatal exceptions.
    
    MFC after:      2 weeks
    Sponsored by:   Innovate UK
    
    (cherry picked from commit 0440b3d2cbf83afb55209a9938b31a48912f222c)
---
 sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c |  2 ++
 sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h    | 16 +++++++++++-----
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index cfd403ac1a01..7192df200ae2 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -549,10 +549,12 @@ dtrace_load##bits(uintptr_t addr)					\
 		return (0);						\
 	}								\
 									\
+	__compiler_membar();						\
 	*flags |= CPU_DTRACE_NOFAULT;					\
 	/*CSTYLED*/							\
 	rval = *((volatile uint##bits##_t *)addr);			\
 	*flags &= ~CPU_DTRACE_NOFAULT;					\
+	__compiler_membar();						\
 									\
 	return (!(*flags & CPU_DTRACE_FAULT) ? rval : 0);		\
 }
diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
index 263b254b9021..c274a9f3357a 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
@@ -2421,11 +2421,17 @@ extern void dtrace_helpers_destroy(proc_t *);
 #define	DTRACE_CPUFLAG_ISSET(flag) \
 	(cpu_core[curcpu].cpuc_dtrace_flags & (flag))
 
-#define	DTRACE_CPUFLAG_SET(flag) \
-	(cpu_core[curcpu].cpuc_dtrace_flags |= (flag))
-
-#define	DTRACE_CPUFLAG_CLEAR(flag) \
-	(cpu_core[curcpu].cpuc_dtrace_flags &= ~(flag))
+#define	DTRACE_CPUFLAG_SET(flag) do {				\
+	__compiler_membar();					\
+	cpu_core[curcpu].cpuc_dtrace_flags |= (flag);		\
+	__compiler_membar();					\
+} while (0)
+
+#define	DTRACE_CPUFLAG_CLEAR(flag) do {				\
+	__compiler_membar();					\
+	cpu_core[curcpu].cpuc_dtrace_flags &= ~(flag);		\
+	__compiler_membar();					\
+} while (0)
 
 #endif /* _KERNEL */