Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.13-rc4 111 lines 2.4 kB view raw
1#define _GNU_SOURCE 2#include <linux/membarrier.h> 3#include <syscall.h> 4#include <stdio.h> 5#include <errno.h> 6#include <string.h> 7 8#include "../kselftest.h" 9 10static int sys_membarrier(int cmd, int flags) 11{ 12 return syscall(__NR_membarrier, cmd, flags); 13} 14 15static int test_membarrier_cmd_fail(void) 16{ 17 int cmd = -1, flags = 0; 18 19 if (sys_membarrier(cmd, flags) != -1) { 20 ksft_exit_fail_msg( 21 "sys membarrier invalid command test: command = %d, flags = %d. Should fail, but passed\n", 22 cmd, flags); 23 } 24 25 ksft_test_result_pass( 26 "sys membarrier invalid command test: command = %d, flags = %d. Failed as expected\n", 27 cmd, flags); 28 return 0; 29} 30 31static int test_membarrier_flags_fail(void) 32{ 33 int cmd = MEMBARRIER_CMD_QUERY, flags = 1; 34 35 if (sys_membarrier(cmd, flags) != -1) { 36 ksft_exit_fail_msg( 37 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Should fail, but passed\n", 38 flags); 39 } 40 41 ksft_test_result_pass( 42 "sys membarrier MEMBARRIER_CMD_QUERY invalid flags test: flags = %d. Failed as expected\n", 43 flags); 44 return 0; 45} 46 47static int test_membarrier_success(void) 48{ 49 int cmd = MEMBARRIER_CMD_SHARED, flags = 0; 50 const char *test_name = "sys membarrier MEMBARRIER_CMD_SHARED\n"; 51 52 if (sys_membarrier(cmd, flags) != 0) { 53 ksft_exit_fail_msg( 54 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n", 55 flags); 56 } 57 58 ksft_test_result_pass( 59 "sys membarrier MEMBARRIER_CMD_SHARED test: flags = %d\n", 60 flags); 61 return 0; 62} 63 64static int test_membarrier(void) 65{ 66 int status; 67 68 status = test_membarrier_cmd_fail(); 69 if (status) 70 return status; 71 status = test_membarrier_flags_fail(); 72 if (status) 73 return status; 74 status = test_membarrier_success(); 75 if (status) 76 return status; 77 return 0; 78} 79 80static int test_membarrier_query(void) 81{ 82 int flags = 0, ret; 83 84 ret = sys_membarrier(MEMBARRIER_CMD_QUERY, flags); 85 if (ret < 0) { 86 if (errno == ENOSYS) { 87 /* 88 * It is valid to build a kernel with 89 * CONFIG_MEMBARRIER=n. However, this skips the tests. 90 */ 91 ksft_exit_skip( 92 "sys membarrier (CONFIG_MEMBARRIER) is disabled.\n"); 93 } 94 ksft_exit_fail_msg("sys_membarrier() failed\n"); 95 } 96 if (!(ret & MEMBARRIER_CMD_SHARED)) 97 ksft_exit_fail_msg("sys_membarrier is not supported.\n"); 98 99 ksft_test_result_pass("sys_membarrier available\n"); 100 return 0; 101} 102 103int main(int argc, char **argv) 104{ 105 ksft_print_header(); 106 107 test_membarrier_query(); 108 test_membarrier(); 109 110 ksft_exit_pass(); 111}