@@ -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+
211240TEST_HARNESS_MAIN
0 commit comments