Commit a06023a8 authored by Beau Belgrave's avatar Beau Belgrave Committed by Shuah Khan

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: 68b4d2d5 ("selftests/user_events: Reenable build")
Reported-by: default avatarNaresh Kamboju <naresh.kamboju@linaro.org>
Link: https://lore.kernel.org/all/CA+G9fYuugZ0OMeS6HvpSS4nuf_A3s455ecipGBvER0LJHojKZg@mail.gmail.com/Signed-off-by: default avatarBeau Belgrave <beaub@linux.microsoft.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 0bb80ecc
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <asm/unistd.h> #include <asm/unistd.h>
#include "../kselftest_harness.h" #include "../kselftest_harness.h"
#include "user_events_selftests.h"
const char *data_file = "/sys/kernel/tracing/user_events_data"; const char *data_file = "/sys/kernel/tracing/user_events_data";
const char *enable_file = "/sys/kernel/tracing/events/user_events/__abi_event/enable"; const char *enable_file = "/sys/kernel/tracing/events/user_events/__abi_event/enable";
...@@ -93,6 +94,8 @@ FIXTURE(user) { ...@@ -93,6 +94,8 @@ FIXTURE(user) {
}; };
FIXTURE_SETUP(user) { FIXTURE_SETUP(user) {
USER_EVENT_FIXTURE_SETUP(return);
change_event(false); change_event(false);
self->check = 0; self->check = 0;
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <unistd.h> #include <unistd.h>
#include "../kselftest_harness.h" #include "../kselftest_harness.h"
#include "user_events_selftests.h"
const char *abi_file = "/sys/kernel/tracing/user_events_data"; const char *abi_file = "/sys/kernel/tracing/user_events_data";
const char *enable_file = "/sys/kernel/tracing/events/user_events/__test_event/enable"; const char *enable_file = "/sys/kernel/tracing/events/user_events/__test_event/enable";
...@@ -146,6 +147,7 @@ FIXTURE(user) { ...@@ -146,6 +147,7 @@ FIXTURE(user) {
}; };
FIXTURE_SETUP(user) { FIXTURE_SETUP(user) {
USER_EVENT_FIXTURE_SETUP(return);
} }
FIXTURE_TEARDOWN(user) { FIXTURE_TEARDOWN(user) {
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <unistd.h> #include <unistd.h>
#include "../kselftest_harness.h" #include "../kselftest_harness.h"
#include "user_events_selftests.h"
const char *data_file = "/sys/kernel/tracing/user_events_data"; const char *data_file = "/sys/kernel/tracing/user_events_data";
const char *status_file = "/sys/kernel/tracing/user_events_status"; const char *status_file = "/sys/kernel/tracing/user_events_status";
...@@ -206,6 +207,8 @@ FIXTURE(user) { ...@@ -206,6 +207,8 @@ FIXTURE(user) {
}; };
FIXTURE_SETUP(user) { FIXTURE_SETUP(user) {
USER_EVENT_FIXTURE_SETUP(return);
self->status_fd = open(status_file, O_RDONLY); self->status_fd = open(status_file, O_RDONLY);
ASSERT_NE(-1, self->status_fd); ASSERT_NE(-1, self->status_fd);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <asm/unistd.h> #include <asm/unistd.h>
#include "../kselftest_harness.h" #include "../kselftest_harness.h"
#include "user_events_selftests.h"
const char *data_file = "/sys/kernel/tracing/user_events_data"; const char *data_file = "/sys/kernel/tracing/user_events_data";
const char *id_file = "/sys/kernel/tracing/events/user_events/__test_event/id"; const char *id_file = "/sys/kernel/tracing/events/user_events/__test_event/id";
...@@ -113,6 +114,8 @@ FIXTURE(user) { ...@@ -113,6 +114,8 @@ FIXTURE(user) {
}; };
FIXTURE_SETUP(user) { FIXTURE_SETUP(user) {
USER_EVENT_FIXTURE_SETUP(return);
self->data_fd = open(data_file, O_RDWR); self->data_fd = open(data_file, O_RDWR);
ASSERT_NE(-1, self->data_fd); ASSERT_NE(-1, self->data_fd);
} }
......
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _USER_EVENTS_SELFTESTS_H
#define _USER_EVENTS_SELFTESTS_H
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mount.h>
#include <unistd.h>
#include <errno.h>
#include "../kselftest.h"
static inline bool tracefs_enabled(char **message, bool *fail)
{
struct stat buf;
int ret;
*message = "";
*fail = false;
/* Ensure tracefs is installed */
ret = stat("/sys/kernel/tracing", &buf);
if (ret == -1) {
*message = "Tracefs is not installed";
return false;
}
/* Ensure mounted tracefs */
ret = stat("/sys/kernel/tracing/README", &buf);
if (ret == -1 && errno == ENOENT) {
if (mount(NULL, "/sys/kernel/tracing", "tracefs", 0, NULL) != 0) {
*message = "Cannot mount tracefs";
*fail = true;
return false;
}
ret = stat("/sys/kernel/tracing/README", &buf);
}
if (ret == -1) {
*message = "Cannot access tracefs";
*fail = true;
return false;
}
return true;
}
static inline bool user_events_enabled(char **message, bool *fail)
{
struct stat buf;
int ret;
*message = "";
*fail = false;
if (getuid() != 0) {
*message = "Must be run as root";
*fail = true;
return false;
}
if (!tracefs_enabled(message, fail))
return false;
/* Ensure user_events is installed */
ret = stat("/sys/kernel/tracing/user_events_data", &buf);
if (ret == -1) {
switch (errno) {
case ENOENT:
*message = "user_events is not installed";
return false;
default:
*message = "Cannot access user_events_data";
*fail = true;
return false;
}
}
return true;
}
#define USER_EVENT_FIXTURE_SETUP(statement) do { \
char *message; \
bool fail; \
if (!user_events_enabled(&message, &fail)) { \
if (fail) { \
TH_LOG("Setup failed due to: %s", message); \
ASSERT_FALSE(fail); \
} \
SKIP(statement, "Skipping due to: %s", message); \
} \
} while (0)
#endif /* _USER_EVENTS_SELFTESTS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment