1 // SPDX-License-Identifier: GPL-2.0 2 #define _GNU_SOURCE 3 #include <linux/membarrier.h> 4 #include <syscall.h> 5 #include <stdio.h> 6 #include <errno.h> 7 #include <string.h> 8 #include <pthread.h> 9 10 #include "membarrier_test_impl.h" 11 12 static int thread_ready, thread_quit; 13 static pthread_mutex_t test_membarrier_thread_mutex = 14 PTHREAD_MUTEX_INITIALIZER; 15 static pthread_cond_t test_membarrier_thread_cond = 16 PTHREAD_COND_INITIALIZER; 17 18 void *test_membarrier_thread(void *arg) 19 { 20 pthread_mutex_lock(&test_membarrier_thread_mutex); 21 thread_ready = 1; 22 pthread_cond_broadcast(&test_membarrier_thread_cond); 23 pthread_mutex_unlock(&test_membarrier_thread_mutex); 24 25 pthread_mutex_lock(&test_membarrier_thread_mutex); 26 while (!thread_quit) 27 pthread_cond_wait(&test_membarrier_thread_cond, 28 &test_membarrier_thread_mutex); 29 pthread_mutex_unlock(&test_membarrier_thread_mutex); 30 31 return NULL; 32 } 33 34 static int test_mt_membarrier(void) 35 { 36 int i; 37 pthread_t test_thread; 38 39 pthread_create(&test_thread, NULL, 40 test_membarrier_thread, NULL); 41 42 pthread_mutex_lock(&test_membarrier_thread_mutex); 43 while (!thread_ready) 44 pthread_cond_wait(&test_membarrier_thread_cond, 45 &test_membarrier_thread_mutex); 46 pthread_mutex_unlock(&test_membarrier_thread_mutex); 47 48 test_membarrier_fail(); 49 50 test_membarrier_success(); 51 52 pthread_mutex_lock(&test_membarrier_thread_mutex); 53 thread_quit = 1; 54 pthread_cond_broadcast(&test_membarrier_thread_cond); 55 pthread_mutex_unlock(&test_membarrier_thread_mutex); 56 57 pthread_join(test_thread, NULL); 58 59 return 0; 60 } 61 62 int main(int argc, char **argv) 63 { 64 ksft_print_header(); 65 ksft_set_plan(13); 66 67 test_membarrier_query(); 68 69 /* Multi-threaded */ 70 test_mt_membarrier(); 71 72 return ksft_exit_pass(); 73 } 74