@@ -62,6 +62,8 @@ static struct perf_event_attr make_event_attr(bool enabled, volatile void *addr,
62
62
.remove_on_exec = 1 , /* Required by sigtrap. */
63
63
.sigtrap = 1 , /* Request synchronous SIGTRAP on event. */
64
64
.sig_data = TEST_SIG_DATA (addr , id ),
65
+ .exclude_kernel = 1 , /* To allow */
66
+ .exclude_hv = 1 , /* running as !root */
65
67
};
66
68
return attr ;
67
69
}
@@ -93,9 +95,13 @@ static void *test_thread(void *arg)
93
95
94
96
__atomic_fetch_add (& ctx .tids_want_signal , tid , __ATOMIC_RELAXED );
95
97
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 );
99
105
}
100
106
101
107
return NULL ;
@@ -208,4 +214,27 @@ TEST_F(sigtrap_threads, signal_stress)
208
214
EXPECT_EQ (ctx .first_siginfo .si_perf_data , TEST_SIG_DATA (& ctx .iterate_on , 0 ));
209
215
}
210
216
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
+
211
240
TEST_HARNESS_MAIN
0 commit comments