-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf tests: Test breakpoint overflow signal handler counts
Adding automated test to check the exact number of breakpoint event overflows and counts. This test was originally done by Vince Weaver for perf_event_tests. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vince Weaver <vincent.weaver@maine.edu> Link: http://lkml.kernel.org/r/1362940871-24486-7-git-send-email-jolsa@redhat.com [ committer note: s/pr_err/pr_debug/g i.e. print just OK or FAILED in non verbose mode ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
- Loading branch information
Jiri Olsa
authored and
Arnaldo Carvalho de Melo
committed
Mar 15, 2013
1 parent
5a6bef4
commit 06933e3
Showing
4 changed files
with
132 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
/* | ||
* Originally done by Vince Weaver <vincent.weaver@maine.edu> for | ||
* perf_event_tests (git://github.com/deater/perf_event_tests) | ||
*/ | ||
|
||
#include <stdlib.h> | ||
#include <stdio.h> | ||
#include <unistd.h> | ||
#include <string.h> | ||
#include <sys/ioctl.h> | ||
#include <time.h> | ||
#include <fcntl.h> | ||
#include <signal.h> | ||
#include <sys/mman.h> | ||
#include <linux/compiler.h> | ||
#include <linux/hw_breakpoint.h> | ||
|
||
#include "tests.h" | ||
#include "debug.h" | ||
#include "perf.h" | ||
|
||
static int overflows; | ||
|
||
__attribute__ ((noinline)) | ||
static int test_function(void) | ||
{ | ||
return time(NULL); | ||
} | ||
|
||
static void sig_handler(int signum __maybe_unused, | ||
siginfo_t *oh __maybe_unused, | ||
void *uc __maybe_unused) | ||
{ | ||
overflows++; | ||
} | ||
|
||
static long long bp_count(int fd) | ||
{ | ||
long long count; | ||
int ret; | ||
|
||
ret = read(fd, &count, sizeof(long long)); | ||
if (ret != sizeof(long long)) { | ||
pr_debug("failed to read: %d\n", ret); | ||
return TEST_FAIL; | ||
} | ||
|
||
return count; | ||
} | ||
|
||
#define EXECUTIONS 10000 | ||
#define THRESHOLD 100 | ||
|
||
int test__bp_signal_overflow(void) | ||
{ | ||
struct perf_event_attr pe; | ||
struct sigaction sa; | ||
long long count; | ||
int fd, i, fails = 0; | ||
|
||
/* setup SIGIO signal handler */ | ||
memset(&sa, 0, sizeof(struct sigaction)); | ||
sa.sa_sigaction = (void *) sig_handler; | ||
sa.sa_flags = SA_SIGINFO; | ||
|
||
if (sigaction(SIGIO, &sa, NULL) < 0) { | ||
pr_debug("failed setting up signal handler\n"); | ||
return TEST_FAIL; | ||
} | ||
|
||
memset(&pe, 0, sizeof(struct perf_event_attr)); | ||
pe.type = PERF_TYPE_BREAKPOINT; | ||
pe.size = sizeof(struct perf_event_attr); | ||
|
||
pe.config = 0; | ||
pe.bp_type = HW_BREAKPOINT_X; | ||
pe.bp_addr = (unsigned long) test_function; | ||
pe.bp_len = sizeof(long); | ||
|
||
pe.sample_period = THRESHOLD; | ||
pe.sample_type = PERF_SAMPLE_IP; | ||
pe.wakeup_events = 1; | ||
|
||
pe.disabled = 1; | ||
pe.exclude_kernel = 1; | ||
pe.exclude_hv = 1; | ||
|
||
fd = sys_perf_event_open(&pe, 0, -1, -1, 0); | ||
if (fd < 0) { | ||
pr_debug("failed opening event %llx\n", pe.config); | ||
return TEST_FAIL; | ||
} | ||
|
||
fcntl(fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC); | ||
fcntl(fd, F_SETSIG, SIGIO); | ||
fcntl(fd, F_SETOWN, getpid()); | ||
|
||
ioctl(fd, PERF_EVENT_IOC_RESET, 0); | ||
ioctl(fd, PERF_EVENT_IOC_ENABLE, 0); | ||
|
||
for (i = 0; i < EXECUTIONS; i++) | ||
test_function(); | ||
|
||
ioctl(fd, PERF_EVENT_IOC_DISABLE, 0); | ||
|
||
count = bp_count(fd); | ||
|
||
close(fd); | ||
|
||
pr_debug("count %lld, overflow %d\n", | ||
count, overflows); | ||
|
||
if (count != EXECUTIONS) { | ||
pr_debug("\tWrong number of executions %lld != %d\n", | ||
count, EXECUTIONS); | ||
fails++; | ||
} | ||
|
||
if (overflows != EXECUTIONS / THRESHOLD) { | ||
pr_debug("\tWrong number of overflows %d != %d\n", | ||
overflows, EXECUTIONS / THRESHOLD); | ||
fails++; | ||
} | ||
|
||
return fails ? TEST_FAIL : TEST_OK; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters