1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef _USER_EVENTS_SELFTESTS_H 4 #define _USER_EVENTS_SELFTESTS_H 5 6 #include <sys/stat.h> 7 #include <sys/types.h> 8 #include <sys/mount.h> 9 #include <unistd.h> 10 #include <errno.h> 11 12 #include "../kselftest.h" 13 14 static inline void tracefs_unmount(void) 15 { 16 umount("/sys/kernel/tracing"); 17 } 18 19 static inline bool tracefs_enabled(char **message, bool *fail, bool *umount) 20 { 21 struct stat buf; 22 int ret; 23 24 *message = ""; 25 *fail = false; 26 *umount = false; 27 28 /* Ensure tracefs is installed */ 29 ret = stat("/sys/kernel/tracing", &buf); 30 31 if (ret == -1) { 32 *message = "Tracefs is not installed"; 33 return false; 34 } 35 36 /* Ensure mounted tracefs */ 37 ret = stat("/sys/kernel/tracing/README", &buf); 38 39 if (ret == -1 && errno == ENOENT) { 40 if (mount(NULL, "/sys/kernel/tracing", "tracefs", 0, NULL) != 0) { 41 *message = "Cannot mount tracefs"; 42 *fail = true; 43 return false; 44 } 45 46 *umount = true; 47 48 ret = stat("/sys/kernel/tracing/README", &buf); 49 } 50 51 if (ret == -1) { 52 *message = "Cannot access tracefs"; 53 *fail = true; 54 return false; 55 } 56 57 return true; 58 } 59 60 static inline bool user_events_enabled(char **message, bool *fail, bool *umount) 61 { 62 struct stat buf; 63 int ret; 64 65 *message = ""; 66 *fail = false; 67 *umount = false; 68 69 if (getuid() != 0) { 70 *message = "Must be run as root"; 71 *fail = true; 72 return false; 73 } 74 75 if (!tracefs_enabled(message, fail, umount)) 76 return false; 77 78 /* Ensure user_events is installed */ 79 ret = stat("/sys/kernel/tracing/user_events_data", &buf); 80 81 if (ret == -1) { 82 switch (errno) { 83 case ENOENT: 84 *message = "user_events is not installed"; 85 return false; 86 87 default: 88 *message = "Cannot access user_events_data"; 89 *fail = true; 90 return false; 91 } 92 } 93 94 return true; 95 } 96 97 #define USER_EVENT_FIXTURE_SETUP(statement, umount) do { \ 98 char *message; \ 99 bool fail; \ 100 if (!user_events_enabled(&message, &fail, &(umount))) { \ 101 if (fail) { \ 102 TH_LOG("Setup failed due to: %s", message); \ 103 ASSERT_FALSE(fail); \ 104 } \ 105 SKIP(statement, "Skipping due to: %s", message); \ 106 } \ 107 } while (0) 108 109 #define USER_EVENT_FIXTURE_TEARDOWN(umount) do { \ 110 if ((umount)) \ 111 tracefs_unmount(); \ 112 } while (0) 113 114 #endif /* _USER_EVENTS_SELFTESTS_H */ 115