Skip to content

Commit 42187bd

Browse files
sunlimingrostedt
authored andcommitted
selftests/user_events: Add perf self-test for empty arguments events
Tests to ensure events that has empty arguments can input trace record correctly when using perf. Link: https://lkml.kernel.org/r/[email protected] Acked-by: Beau Belgrave <[email protected]> Acked-by: Masami Hiramatsu (Google) <[email protected]> Signed-off-by: sunliming <[email protected]> Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent 4b56c21 commit 42187bd

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

tools/testing/selftests/user_events/perf_test.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,59 @@ TEST_F(user, perf_write) {
189189
ASSERT_EQ(0, self->check);
190190
}
191191

192+
TEST_F(user, perf_empty_events) {
193+
struct perf_event_attr pe = {0};
194+
struct user_reg reg = {0};
195+
struct perf_event_mmap_page *perf_page;
196+
int page_size = sysconf(_SC_PAGESIZE);
197+
int id, fd;
198+
__u32 *val;
199+
200+
reg.size = sizeof(reg);
201+
reg.name_args = (__u64)"__test_event";
202+
reg.enable_bit = 31;
203+
reg.enable_addr = (__u64)&self->check;
204+
reg.enable_size = sizeof(self->check);
205+
206+
/* Register should work */
207+
ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, &reg));
208+
ASSERT_EQ(0, reg.write_index);
209+
ASSERT_EQ(0, self->check);
210+
211+
/* Id should be there */
212+
id = get_id();
213+
ASSERT_NE(-1, id);
214+
215+
pe.type = PERF_TYPE_TRACEPOINT;
216+
pe.size = sizeof(pe);
217+
pe.config = id;
218+
pe.sample_type = PERF_SAMPLE_RAW;
219+
pe.sample_period = 1;
220+
pe.wakeup_events = 1;
221+
222+
/* Tracepoint attach should work */
223+
fd = perf_event_open(&pe, 0, -1, -1, 0);
224+
ASSERT_NE(-1, fd);
225+
226+
perf_page = mmap(NULL, page_size * 2, PROT_READ, MAP_SHARED, fd, 0);
227+
ASSERT_NE(MAP_FAILED, perf_page);
228+
229+
/* Status should be updated */
230+
ASSERT_EQ(1 << reg.enable_bit, self->check);
231+
232+
/* Ensure write shows up at correct offset */
233+
ASSERT_NE(-1, write(self->data_fd, &reg.write_index,
234+
sizeof(reg.write_index)));
235+
val = (void *)(((char *)perf_page) + perf_page->data_offset);
236+
ASSERT_EQ(PERF_RECORD_SAMPLE, *val);
237+
238+
munmap(perf_page, page_size * 2);
239+
close(fd);
240+
241+
/* Status should be updated */
242+
ASSERT_EQ(0, self->check);
243+
}
244+
192245
int main(int argc, char **argv)
193246
{
194247
return test_harness_run(argc, argv);

0 commit comments

Comments
 (0)