Skip to content

Commit 23488ec

Browse files
melverPeter Zijlstra
authored andcommitted
selftests/perf_events: Add a SIGTRAP stress test with disables
Add a SIGTRAP stress test that exercises repeatedly enabling/disabling an event while it concurrently keeps firing. Signed-off-by: Marco Elver <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Link: https://lore.kernel.org/all/[email protected]/
1 parent ca6c213 commit 23488ec

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

tools/testing/selftests/perf_events/sigtrap_threads.c

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ static struct perf_event_attr make_event_attr(bool enabled, volatile void *addr,
6262
.remove_on_exec = 1, /* Required by sigtrap. */
6363
.sigtrap = 1, /* Request synchronous SIGTRAP on event. */
6464
.sig_data = TEST_SIG_DATA(addr, id),
65+
.exclude_kernel = 1, /* To allow */
66+
.exclude_hv = 1, /* running as !root */
6567
};
6668
return attr;
6769
}
@@ -93,9 +95,13 @@ static void *test_thread(void *arg)
9395

9496
__atomic_fetch_add(&ctx.tids_want_signal, tid, __ATOMIC_RELAXED);
9597
iter = ctx.iterate_on; /* read */
96-
for (i = 0; i < iter - 1; i++) {
97-
__atomic_fetch_add(&ctx.tids_want_signal, tid, __ATOMIC_RELAXED);
98-
ctx.iterate_on = iter; /* idempotent write */
98+
if (iter >= 0) {
99+
for (i = 0; i < iter - 1; i++) {
100+
__atomic_fetch_add(&ctx.tids_want_signal, tid, __ATOMIC_RELAXED);
101+
ctx.iterate_on = iter; /* idempotent write */
102+
}
103+
} else {
104+
while (ctx.iterate_on);
99105
}
100106

101107
return NULL;
@@ -208,4 +214,27 @@ TEST_F(sigtrap_threads, signal_stress)
208214
EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on, 0));
209215
}
210216

217+
TEST_F(sigtrap_threads, signal_stress_with_disable)
218+
{
219+
const int target_count = NUM_THREADS * 3000;
220+
int i;
221+
222+
ctx.iterate_on = -1;
223+
224+
EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_ENABLE, 0), 0);
225+
pthread_barrier_wait(&self->barrier);
226+
while (__atomic_load_n(&ctx.signal_count, __ATOMIC_RELAXED) < target_count) {
227+
EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_DISABLE, 0), 0);
228+
EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_ENABLE, 0), 0);
229+
}
230+
ctx.iterate_on = 0;
231+
for (i = 0; i < NUM_THREADS; i++)
232+
ASSERT_EQ(pthread_join(self->threads[i], NULL), 0);
233+
EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_DISABLE, 0), 0);
234+
235+
EXPECT_EQ(ctx.first_siginfo.si_addr, &ctx.iterate_on);
236+
EXPECT_EQ(ctx.first_siginfo.si_perf_type, PERF_TYPE_BREAKPOINT);
237+
EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on, 0));
238+
}
239+
211240
TEST_HARNESS_MAIN

0 commit comments

Comments
 (0)