git: 342ce4b6b4d9 - stable/15 - membarrier(2): implement the MEMBARRIER_CMD_GET_REGISTRATIONS command
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 27 Apr 2026 01:29:45 UTC
The branch stable/15 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=342ce4b6b4d98c5bf6ba5e0be46dd2805d710d75
commit 342ce4b6b4d98c5bf6ba5e0be46dd2805d710d75
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-04-18 18:43:59 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-04-27 01:28:59 +0000
membarrier(2): implement the MEMBARRIER_CMD_GET_REGISTRATIONS command
(cherry picked from commit aaa10396a997bafc28ce6551e92563620caf3df4)
---
sys/kern/kern_membarrier.c | 20 +++++++++++++++++---
sys/sys/membarrier.h | 3 +++
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/sys/kern/kern_membarrier.c b/sys/kern/kern_membarrier.c
index 6d210a1b1783..0c8f4b843473 100644
--- a/sys/kern/kern_membarrier.c
+++ b/sys/kern/kern_membarrier.c
@@ -51,7 +51,8 @@
MEMBARRIER_CMD_PRIVATE_EXPEDITED | \
MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED | \
MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE | \
- MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE)
+ MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE | \
+ MEMBARRIER_CMD_GET_REGISTRATIONS)
static void
membarrier_action_seqcst(void *arg __unused)
@@ -120,7 +121,7 @@ kern_membarrier(struct thread *td, int cmd, unsigned flags, int cpu_id)
struct thread *td1;
cpuset_t cs;
uint64_t *swt;
- int c, error, f;
+ int c, error, f, res;
bool first;
if (flags != 0 || (cmd & ~MEMBARRIER_SUPPORTED_CMDS) != 0)
@@ -218,13 +219,26 @@ kern_membarrier(struct thread *td, int cmd, unsigned flags, int cpu_id)
break;
case MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE:
- if ((p->p_flag2 & P2_MEMBAR_PRIVE_SYNCORE) == 0) {
+ if ((f & P2_MEMBAR_PRIVE_SYNCORE) == 0) {
PROC_LOCK(p);
p->p_flag2 |= P2_MEMBAR_PRIVE_SYNCORE;
PROC_UNLOCK(p);
}
break;
+ case MEMBARRIER_CMD_GET_REGISTRATIONS:
+ res = 0;
+ if ((f & P2_MEMBAR_GLOBE) != 0)
+ res |= MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED;
+ if ((f & P2_MEMBAR_PRIVE) != 0)
+ res |= MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED;
+ if ((f & P2_MEMBAR_PRIVE_SYNCORE) != 0) {
+ res |=
+ MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE;
+ }
+ td->td_retval[0] = res;
+ break;
+
default:
error = EINVAL;
break;
diff --git a/sys/sys/membarrier.h b/sys/sys/membarrier.h
index 31a605634ddb..34a525dabae6 100644
--- a/sys/sys/membarrier.h
+++ b/sys/sys/membarrier.h
@@ -55,6 +55,9 @@ enum membarrier_cmd {
*/
MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 0x00000080,
MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 0x00000100,
+
+ /* Return the bitmask of current registrations. */
+ MEMBARRIER_CMD_GET_REGISTRATIONS = 0x00000200,
};
enum membarrier_cmd_flag {