Skip to content

Commit cf74c59

Browse files
beaubelgraverostedt
authored andcommitted
selftests/user_events: Test persist flag cases
Now that we have exposed USER_EVENT_REG_PERSIST events can persist both via the ABI and in the /sys/kernel/tracing/dynamic_events file. Ensure both the ABI and DYN cases work by calling both during the parse tests. Add new flags test that ensures only USER_EVENT_REG_PERSIST is honored and any other flag is invalid. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Beau Belgrave <[email protected]> Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent 5dbd04e commit cf74c59

File tree

2 files changed

+107
-2
lines changed

2 files changed

+107
-2
lines changed

tools/testing/selftests/user_events/abi_test.c

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@
2424
const char *data_file = "/sys/kernel/tracing/user_events_data";
2525
const char *enable_file = "/sys/kernel/tracing/events/user_events/__abi_event/enable";
2626

27+
static bool event_exists(void)
28+
{
29+
int fd = open(enable_file, O_RDWR);
30+
31+
if (fd < 0)
32+
return false;
33+
34+
close(fd);
35+
36+
return true;
37+
}
38+
2739
static int change_event(bool enable)
2840
{
2941
int fd = open(enable_file, O_RDWR);
@@ -47,7 +59,22 @@ static int change_event(bool enable)
4759
return ret;
4860
}
4961

50-
static int reg_enable(long *enable, int size, int bit)
62+
static int event_delete(void)
63+
{
64+
int fd = open(data_file, O_RDWR);
65+
int ret;
66+
67+
if (fd < 0)
68+
return -1;
69+
70+
ret = ioctl(fd, DIAG_IOCSDEL, "__abi_event");
71+
72+
close(fd);
73+
74+
return ret;
75+
}
76+
77+
static int reg_enable_flags(long *enable, int size, int bit, int flags)
5178
{
5279
struct user_reg reg = {0};
5380
int fd = open(data_file, O_RDWR);
@@ -58,6 +85,7 @@ static int reg_enable(long *enable, int size, int bit)
5885

5986
reg.size = sizeof(reg);
6087
reg.name_args = (__u64)"__abi_event";
88+
reg.flags = flags;
6189
reg.enable_bit = bit;
6290
reg.enable_addr = (__u64)enable;
6391
reg.enable_size = size;
@@ -69,6 +97,11 @@ static int reg_enable(long *enable, int size, int bit)
6997
return ret;
7098
}
7199

100+
static int reg_enable(long *enable, int size, int bit)
101+
{
102+
return reg_enable_flags(enable, size, bit, 0);
103+
}
104+
72105
static int reg_disable(long *enable, int bit)
73106
{
74107
struct user_unreg reg = {0};
@@ -126,6 +159,26 @@ TEST_F(user, enablement) {
126159
ASSERT_EQ(0, change_event(false));
127160
}
128161

162+
TEST_F(user, flags) {
163+
/* USER_EVENT_REG_PERSIST is allowed */
164+
ASSERT_EQ(0, reg_enable_flags(&self->check, sizeof(int), 0,
165+
USER_EVENT_REG_PERSIST));
166+
ASSERT_EQ(0, reg_disable(&self->check, 0));
167+
168+
/* Ensure it exists after close and disable */
169+
ASSERT_TRUE(event_exists());
170+
171+
/* Ensure we can delete it */
172+
ASSERT_EQ(0, event_delete());
173+
174+
/* USER_EVENT_REG_MAX or above is not allowed */
175+
ASSERT_EQ(-1, reg_enable_flags(&self->check, sizeof(int), 0,
176+
USER_EVENT_REG_MAX));
177+
178+
/* Ensure it does not exist after invalid flags */
179+
ASSERT_FALSE(event_exists());
180+
}
181+
129182
TEST_F(user, bit_sizes) {
130183
/* Allow 0-31 bits for 32-bit */
131184
ASSERT_EQ(0, reg_enable(&self->check, sizeof(int), 0));

tools/testing/selftests/user_events/dyn_test.c

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,25 @@
1717
#include "../kselftest_harness.h"
1818
#include "user_events_selftests.h"
1919

20+
const char *dyn_file = "/sys/kernel/tracing/dynamic_events";
2021
const char *abi_file = "/sys/kernel/tracing/user_events_data";
2122
const char *enable_file = "/sys/kernel/tracing/events/user_events/__test_event/enable";
2223

24+
static int event_delete(void)
25+
{
26+
int fd = open(abi_file, O_RDWR);
27+
int ret;
28+
29+
if (fd < 0)
30+
return -1;
31+
32+
ret = ioctl(fd, DIAG_IOCSDEL, "__test_event");
33+
34+
close(fd);
35+
36+
return ret;
37+
}
38+
2339
static bool wait_for_delete(void)
2440
{
2541
int i;
@@ -64,7 +80,31 @@ static int unreg_event(int fd, int *check, int bit)
6480
return ioctl(fd, DIAG_IOCSUNREG, &unreg);
6581
}
6682

67-
static int parse(int *check, const char *value)
83+
static int parse_dyn(const char *value)
84+
{
85+
int fd = open(dyn_file, O_RDWR | O_APPEND);
86+
int len = strlen(value);
87+
int ret;
88+
89+
if (fd == -1)
90+
return -1;
91+
92+
ret = write(fd, value, len);
93+
94+
if (ret == len)
95+
ret = 0;
96+
else
97+
ret = -1;
98+
99+
close(fd);
100+
101+
if (ret == 0)
102+
event_delete();
103+
104+
return ret;
105+
}
106+
107+
static int parse_abi(int *check, const char *value)
68108
{
69109
int fd = open(abi_file, O_RDWR);
70110
int ret;
@@ -90,6 +130,18 @@ static int parse(int *check, const char *value)
90130
return ret;
91131
}
92132

133+
static int parse(int *check, const char *value)
134+
{
135+
int abi_ret = parse_abi(check, value);
136+
int dyn_ret = parse_dyn(value);
137+
138+
/* Ensure both ABI and DYN parse the same way */
139+
if (dyn_ret != abi_ret)
140+
return -1;
141+
142+
return dyn_ret;
143+
}
144+
93145
static int check_match(int *check, const char *first, const char *second, bool *match)
94146
{
95147
int fd = open(abi_file, O_RDWR);

0 commit comments

Comments
 (0)