user_events_selftests.h 2.1 KB

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