On Thu, 7 Sep 2023 22:35:36 +0000 Beau Belgrave <beaub@xxxxxxxxxxxxxxxxxxx> wrote: > diff --git a/tools/testing/selftests/user_events/user_events_selftests.h b/tools/testing/selftests/user_events/user_events_selftests.h > new file mode 100644 > index 000000000000..72692e62c709 > --- /dev/null > +++ b/tools/testing/selftests/user_events/user_events_selftests.h > @@ -0,0 +1,103 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > + > +#ifndef _USER_EVENTS_SELFTESTS_H > +#define _USER_EVENTS_SELFTESTS_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) > +{ > + int fd; > + > + *message = ""; > + *fail = false; > + > + /* Ensure tracefs is installed */ > + fd = open("/sys/kernel/tracing", O_RDONLY); Instead of opening the directory, I believe that "stat()" is the preferred method of testing existence. > + > + if (fd == -1) { > + *message = "Tracefs is not installed"; > + return false; > + } > + > + close(fd); > + > + /* Ensure mounted tracefs */ > + fd = open("/sys/kernel/tracing/README", O_RDONLY); > + > + if (fd == -1 && errno == ENOENT) { > + if (mount(NULL, "/sys/kernel/tracing", "tracefs", 0, NULL) != 0) { > + *message = "Cannot mount tracefs"; > + *fail = true; > + return false; > + } > + > + fd = open("/sys/kernel/tracing/README", O_RDONLY); Same here, unless you want to make sure you can also read it. > + } > + > + if (fd == -1) { > + *message = "Cannot access tracefs"; > + *fail = true; > + return false; > + } > + > + close(fd); > + > + return true; > +} > + > +static inline bool user_events_enabled(char **message, bool *fail) > +{ > + int fd; > + > + *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 */ > + fd = open("/sys/kernel/tracing/user_events_data", O_RDONLY); ditto. -- Steve > + > + if (fd == -1) { > + switch (errno) { > + case ENOENT: > + *message = "user_events is not installed"; > + return false; > + > + default: > + *message = "Cannot access user_events_data"; > + *fail = true; > + return false; > + } > + } > + > + close(fd); > + > + 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 */ > > base-commit: 9b1db732866bee060b9bca9493e5ebf5e8874c48