diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-10-23 10:14:45 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-10-23 10:14:45 -0700 | 
| commit | a70385240892bcbc6442b054e847c74100e72f1a (patch) | |
| tree | 86e46f94b5a1acd34925242c2d41da381be879e5 /tools | |
| parent | c70055d8d9a0b2c500446065c1b80d9836789596 (diff) | |
| parent | 21da7472a040420f2dc624ffec70291a72c5d6a6 (diff) | |
Merge tag 'perf_urgent_for_v6.1_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Borislav Petkov:
 - Fix raw data handling when perf events are used in bpf
 - Rework how SIGTRAPs get delivered to events to address a bunch of
   problems with it. Add a selftest for that too
* tag 'perf_urgent_for_v6.1_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  bpf: Fix sample_flags for bpf_perf_event_output
  selftests/perf_events: Add a SIGTRAP stress test with disables
  perf: Fix missing SIGTRAPs
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/testing/selftests/perf_events/sigtrap_threads.c | 35 | 
1 files changed, 32 insertions, 3 deletions
| diff --git a/tools/testing/selftests/perf_events/sigtrap_threads.c b/tools/testing/selftests/perf_events/sigtrap_threads.c index 6d849dc2bee0..d1d8483ac628 100644 --- a/tools/testing/selftests/perf_events/sigtrap_threads.c +++ b/tools/testing/selftests/perf_events/sigtrap_threads.c @@ -62,6 +62,8 @@ static struct perf_event_attr make_event_attr(bool enabled, volatile void *addr,  		.remove_on_exec = 1, /* Required by sigtrap. */  		.sigtrap	= 1, /* Request synchronous SIGTRAP on event. */  		.sig_data	= TEST_SIG_DATA(addr, id), +		.exclude_kernel = 1, /* To allow */ +		.exclude_hv     = 1, /* running as !root */  	};  	return attr;  } @@ -93,9 +95,13 @@ static void *test_thread(void *arg)  	__atomic_fetch_add(&ctx.tids_want_signal, tid, __ATOMIC_RELAXED);  	iter = ctx.iterate_on; /* read */ -	for (i = 0; i < iter - 1; i++) { -		__atomic_fetch_add(&ctx.tids_want_signal, tid, __ATOMIC_RELAXED); -		ctx.iterate_on = iter; /* idempotent write */ +	if (iter >= 0) { +		for (i = 0; i < iter - 1; i++) { +			__atomic_fetch_add(&ctx.tids_want_signal, tid, __ATOMIC_RELAXED); +			ctx.iterate_on = iter; /* idempotent write */ +		} +	} else { +		while (ctx.iterate_on);  	}  	return NULL; @@ -208,4 +214,27 @@ TEST_F(sigtrap_threads, signal_stress)  	EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on, 0));  } +TEST_F(sigtrap_threads, signal_stress_with_disable) +{ +	const int target_count = NUM_THREADS * 3000; +	int i; + +	ctx.iterate_on = -1; + +	EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_ENABLE, 0), 0); +	pthread_barrier_wait(&self->barrier); +	while (__atomic_load_n(&ctx.signal_count, __ATOMIC_RELAXED) < target_count) { +		EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_DISABLE, 0), 0); +		EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_ENABLE, 0), 0); +	} +	ctx.iterate_on = 0; +	for (i = 0; i < NUM_THREADS; i++) +		ASSERT_EQ(pthread_join(self->threads[i], NULL), 0); +	EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_DISABLE, 0), 0); + +	EXPECT_EQ(ctx.first_siginfo.si_addr, &ctx.iterate_on); +	EXPECT_EQ(ctx.first_siginfo.si_perf_type, PERF_TYPE_BREAKPOINT); +	EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on, 0)); +} +  TEST_HARNESS_MAIN | 
