membarrier(2) System Calls Manual membarrier(2) membarrier - (libc -lc) #include /* MEMBARRIER_* */ #include /* SYS_* */ #include int syscall(SYS_membarrier, int cmd, unsigned int flags, int cpu_id); : glibc membarrier() syscall(2). membarrier() . . . ( " ") ( " "). membarrier(). : asm volatile ("" : : : "memory") membarrier(). membarrier() . cmd : MEMBARRIER_CMD_QUERY ( Linux 4.3) . . MEMBARRIER_CMD_QUERY 0 . ( membarrier()). MEMBARRIER_CMD_GLOBAL ( Linux 4.16) membarrier(). . MEMBARRIER_CMD_GLOBAL_EXPEDITED ( Linux 4.16) MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED. ( ). MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED. MEMBARRIER_CMD_GLOBAL_EXPEDITED MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED. "" . MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED ( Linux 4.16) MEMBARRIER_CMD_GLOBAL_EXPEDITED. MEMBARRIER_CMD_PRIVATE_EXPEDITED ( Linux 4.14) . ( ). . "" . . MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED ( Linux 4.14) MEMBARRIER_CMD_PRIVATE_EXPEDITED. MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE ( Linux 4.16) MEMBARRIER_CMD_PRIVATE_EXPEDITED . . "" . . MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE ( 4.16) MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE. MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ ( 5.10) rseq flags 0 flags MEMBARRIER_CMD_FLAG_CPU cpu_id. . RSEQ " ". rseq . MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ ( 5.10) MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ. MEMBARRIER_CMD_SHARED ( 4.3) MEMBARRIER_CMD_GLOBAL . flags 0 MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ flags 0 MEMBARRIER_CMD_FLAG_CPU. cpu_id flags MEMBARRIER_CMD_FLAG_CPU . membarrier(). barrier() smp_mb() barrier() membarrier() smp_mb(). (O: X: ): barrier() smp_mb() membarrier() barrier() X X O smp_mb() X O O membarrier() O O O MEMBARRIER_CMD_QUERY MEMBARRIER_CMD_GLOBAL MEMBARRIER_CMD_GLOBAL_EXPEDITED MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED MEMBARRIER_CMD_PRIVATE_EXPEDITED MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE . -1 errno . flags 0 . . flags 0 membarrier(). EINVAL cmd flags MEMBARRIER_CMD_GLOBAL nohz_full MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE . ENOSYS membarrier() . EPERM . . 4.3. 5.10 : int membarrier(int cmd, int flags); . . . . membarrier() -- . "fast_path()" "slow_path()" (x86) membarrier(): #include static volatile int a, b; static void fast_path(int *read_b) { a = 1; asm volatile ("mfence" : : : "memory"); *read_b = b; } static void slow_path(int *read_a) { b = 1; asm volatile ("mfence" : : : "memory"); *read_a = a; } int main(void) { int read_a, read_b; /* * Real applications would call fast_path() and slow_path() * from different threads. Call those from main() to keep * this example short. */ slow_path(&read_a); fast_path(&read_b); /* * read_b == 0 implies read_a == 1 and * read_a == 0 implies read_b == 1. */ if (read_b == 0 && read_a == 0) abort(); exit(EXIT_SUCCESS); } membarrier() : #define _GNU_SOURCE #include #include #include #include #include static volatile int a, b; static int membarrier(int cmd, unsigned int flags, int cpu_id) { return syscall(__NR_membarrier, cmd, flags, cpu_id); } static int init_membarrier(void) { int ret; /* Check that membarrier() is supported. */ ret = membarrier(MEMBARRIER_CMD_QUERY, 0, 0); if (ret < 0) { perror("membarrier"); return -1; } if (!(ret & MEMBARRIER_CMD_GLOBAL)) { fprintf(stderr, "membarrier does not support MEMBARRIER_CMD_GLOBAL\n"); return -1; } return 0; } static void fast_path(int *read_b) { a = 1; asm volatile ("" : : : "memory"); *read_b = b; } static void slow_path(int *read_a) { b = 1; membarrier(MEMBARRIER_CMD_GLOBAL, 0, 0); *read_a = a; } int main(int argc, char *argv[]) { int read_a, read_b; if (init_membarrier()) exit(EXIT_FAILURE); /* * Real applications would call fast_path() and slow_path() * from different threads. Call those from main() to keep * this example short. */ slow_path(&read_a); fast_path(&read_b); /* * read_b == 0 implies read_a == 1 and * read_a == 0 implies read_b == 1. */ if (read_b == 0 && read_a == 0) abort(); exit(EXIT_SUCCESS); } 3 . . : . 6.18 21 2025 membarrier(2)