Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Apr 2026 17:42:49 +0000
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: aaa10396a997 - main - membarrier(2): implement the MEMBARRIER_CMD_GET_REGISTRATIONS command
Message-ID:  <69e66599.41ab7.6d150451@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by kib:

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

commit aaa10396a997bafc28ce6551e92563620caf3df4
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-04-18 18:43:59 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-04-20 17:42:28 +0000

    membarrier(2): implement the MEMBARRIER_CMD_GET_REGISTRATIONS command
    
    Reported by:    Ricardo Branco <rbranco@suse.com>
    Reviewed by:    markj, Ricardo Branco <rbranco@suse.com>
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D56507
---
 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 {


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69e66599.41ab7.6d150451>