Skip to content

Commit a06023a

Browse files
beaubelgraveshuahkh
authored andcommitted
selftests/user_events: Fix failures when user_events is not installed
When user_events is not installed the self tests currently fail. Now that these self tests run by default we need to ensure they don't fail when user_events was not enabled for the kernel being tested. Add common methods to detect if tracefs and user_events is enabled. If either is not enabled skip the test. If tracefs is enabled, but is not mounted, mount tracefs and fail if there were any errors. Fail if not run as root. Fixes: 68b4d2d ("selftests/user_events: Reenable build") Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org> Link: https://lore.kernel.org/all/CA+G9fYuugZ0OMeS6HvpSS4nuf_A3s455ecipGBvER0LJHojKZg@mail.gmail.com/ Signed-off-by: Beau Belgrave <beaub@linux.microsoft.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
1 parent 0bb80ec commit a06023a

File tree

5 files changed

+111
-0
lines changed

5 files changed

+111
-0
lines changed

tools/testing/selftests/user_events/abi_test.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <asm/unistd.h>
2020

2121
#include "../kselftest_harness.h"
22+
#include "user_events_selftests.h"
2223

2324
const char *data_file = "/sys/kernel/tracing/user_events_data";
2425
const char *enable_file = "/sys/kernel/tracing/events/user_events/__abi_event/enable";
@@ -93,6 +94,8 @@ FIXTURE(user) {
9394
};
9495

9596
FIXTURE_SETUP(user) {
97+
USER_EVENT_FIXTURE_SETUP(return);
98+
9699
change_event(false);
97100
self->check = 0;
98101
}

tools/testing/selftests/user_events/dyn_test.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <unistd.h>
1616

1717
#include "../kselftest_harness.h"
18+
#include "user_events_selftests.h"
1819

1920
const char *abi_file = "/sys/kernel/tracing/user_events_data";
2021
const char *enable_file = "/sys/kernel/tracing/events/user_events/__test_event/enable";
@@ -146,6 +147,7 @@ FIXTURE(user) {
146147
};
147148

148149
FIXTURE_SETUP(user) {
150+
USER_EVENT_FIXTURE_SETUP(return);
149151
}
150152

151153
FIXTURE_TEARDOWN(user) {

tools/testing/selftests/user_events/ftrace_test.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <unistd.h>
1717

1818
#include "../kselftest_harness.h"
19+
#include "user_events_selftests.h"
1920

2021
const char *data_file = "/sys/kernel/tracing/user_events_data";
2122
const char *status_file = "/sys/kernel/tracing/user_events_status";
@@ -206,6 +207,8 @@ FIXTURE(user) {
206207
};
207208

208209
FIXTURE_SETUP(user) {
210+
USER_EVENT_FIXTURE_SETUP(return);
211+
209212
self->status_fd = open(status_file, O_RDONLY);
210213
ASSERT_NE(-1, self->status_fd);
211214

tools/testing/selftests/user_events/perf_test.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <asm/unistd.h>
1818

1919
#include "../kselftest_harness.h"
20+
#include "user_events_selftests.h"
2021

2122
const char *data_file = "/sys/kernel/tracing/user_events_data";
2223
const char *id_file = "/sys/kernel/tracing/events/user_events/__test_event/id";
@@ -113,6 +114,8 @@ FIXTURE(user) {
113114
};
114115

115116
FIXTURE_SETUP(user) {
117+
USER_EVENT_FIXTURE_SETUP(return);
118+
116119
self->data_fd = open(data_file, O_RDWR);
117120
ASSERT_NE(-1, self->data_fd);
118121
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
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 bool tracefs_enabled(char **message, bool *fail)
15+
{
16+
struct stat buf;
17+
int ret;
18+
19+
*message = "";
20+
*fail = false;
21+
22+
/* Ensure tracefs is installed */
23+
ret = stat("/sys/kernel/tracing", &buf);
24+
25+
if (ret == -1) {
26+
*message = "Tracefs is not installed";
27+
return false;
28+
}
29+
30+
/* Ensure mounted tracefs */
31+
ret = stat("/sys/kernel/tracing/README", &buf);
32+
33+
if (ret == -1 && errno == ENOENT) {
34+
if (mount(NULL, "/sys/kernel/tracing", "tracefs", 0, NULL) != 0) {
35+
*message = "Cannot mount tracefs";
36+
*fail = true;
37+
return false;
38+
}
39+
40+
ret = stat("/sys/kernel/tracing/README", &buf);
41+
}
42+
43+
if (ret == -1) {
44+
*message = "Cannot access tracefs";
45+
*fail = true;
46+
return false;
47+
}
48+
49+
return true;
50+
}
51+
52+
static inline bool user_events_enabled(char **message, bool *fail)
53+
{
54+
struct stat buf;
55+
int ret;
56+
57+
*message = "";
58+
*fail = false;
59+
60+
if (getuid() != 0) {
61+
*message = "Must be run as root";
62+
*fail = true;
63+
return false;
64+
}
65+
66+
if (!tracefs_enabled(message, fail))
67+
return false;
68+
69+
/* Ensure user_events is installed */
70+
ret = stat("/sys/kernel/tracing/user_events_data", &buf);
71+
72+
if (ret == -1) {
73+
switch (errno) {
74+
case ENOENT:
75+
*message = "user_events is not installed";
76+
return false;
77+
78+
default:
79+
*message = "Cannot access user_events_data";
80+
*fail = true;
81+
return false;
82+
}
83+
}
84+
85+
return true;
86+
}
87+
88+
#define USER_EVENT_FIXTURE_SETUP(statement) do { \
89+
char *message; \
90+
bool fail; \
91+
if (!user_events_enabled(&message, &fail)) { \
92+
if (fail) { \
93+
TH_LOG("Setup failed due to: %s", message); \
94+
ASSERT_FALSE(fail); \
95+
} \
96+
SKIP(statement, "Skipping due to: %s", message); \
97+
} \
98+
} while (0)
99+
100+
#endif /* _USER_EVENTS_SELFTESTS_H */

0 commit comments

Comments
 (0)