diff options
author | David Ahern <dsahern@gmail.com> | 2013-12-04 21:41:39 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-12-05 08:05:45 -0500 |
commit | 9aca7f1792c5d2d5d367bbe5cfe204fe40517929 (patch) | |
tree | c83ff78b2785e7598f2175890e723c8783e454b1 /tools/perf | |
parent | 6d65894bc028d0342829ea1e64c9e9efad571124 (diff) |
perf trace: Add support for syscalls vs raw_syscalls
Older kernels (e.g., RHEL6) do system call tracing via
syscalls:sys_{enter,exit} rather than raw_syscalls. Update perf-trace to
detect lack of raw_syscalls support and try syscalls.
Signed-off-by: David Ahern <dsahern@gmail.com>
Link: http://lkml.kernel.org/r/1386211302-31303-2-git-send-email-dsahern@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/builtin-trace.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 56afe339661a..a7aa771a98e6 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include "util/thread_map.h" | 12 | #include "util/thread_map.h" |
13 | #include "util/stat.h" | 13 | #include "util/stat.h" |
14 | #include "trace-event.h" | 14 | #include "trace-event.h" |
15 | #include "util/parse-events.h" | ||
15 | 16 | ||
16 | #include <libaudit.h> | 17 | #include <libaudit.h> |
17 | #include <stdlib.h> | 18 | #include <stdlib.h> |
@@ -173,6 +174,10 @@ static struct perf_evsel *perf_evsel__syscall_newtp(const char *direction, void | |||
173 | { | 174 | { |
174 | struct perf_evsel *evsel = perf_evsel__newtp("raw_syscalls", direction); | 175 | struct perf_evsel *evsel = perf_evsel__newtp("raw_syscalls", direction); |
175 | 176 | ||
177 | /* older kernel (e.g., RHEL6) use syscalls:{enter,exit} */ | ||
178 | if (evsel == NULL) | ||
179 | evsel = perf_evsel__newtp("syscalls", direction); | ||
180 | |||
176 | if (evsel) { | 181 | if (evsel) { |
177 | if (perf_evsel__init_syscall_tp(evsel, handler)) | 182 | if (perf_evsel__init_syscall_tp(evsel, handler)) |
178 | goto out_delete; | 183 | goto out_delete; |
@@ -1801,10 +1806,11 @@ static int trace__record(int argc, const char **argv) | |||
1801 | "-R", | 1806 | "-R", |
1802 | "-m", "1024", | 1807 | "-m", "1024", |
1803 | "-c", "1", | 1808 | "-c", "1", |
1804 | "-e", "raw_syscalls:sys_enter,raw_syscalls:sys_exit", | 1809 | "-e", |
1805 | }; | 1810 | }; |
1806 | 1811 | ||
1807 | rec_argc = ARRAY_SIZE(record_args) + argc; | 1812 | /* +1 is for the event string below */ |
1813 | rec_argc = ARRAY_SIZE(record_args) + 1 + argc; | ||
1808 | rec_argv = calloc(rec_argc + 1, sizeof(char *)); | 1814 | rec_argv = calloc(rec_argc + 1, sizeof(char *)); |
1809 | 1815 | ||
1810 | if (rec_argv == NULL) | 1816 | if (rec_argv == NULL) |
@@ -1813,6 +1819,17 @@ static int trace__record(int argc, const char **argv) | |||
1813 | for (i = 0; i < ARRAY_SIZE(record_args); i++) | 1819 | for (i = 0; i < ARRAY_SIZE(record_args); i++) |
1814 | rec_argv[i] = record_args[i]; | 1820 | rec_argv[i] = record_args[i]; |
1815 | 1821 | ||
1822 | /* event string may be different for older kernels - e.g., RHEL6 */ | ||
1823 | if (is_valid_tracepoint("raw_syscalls:sys_enter")) | ||
1824 | rec_argv[i] = "raw_syscalls:sys_enter,raw_syscalls:sys_exit"; | ||
1825 | else if (is_valid_tracepoint("syscalls:sys_enter")) | ||
1826 | rec_argv[i] = "syscalls:sys_enter,syscalls:sys_exit"; | ||
1827 | else { | ||
1828 | pr_err("Neither raw_syscalls nor syscalls events exist.\n"); | ||
1829 | return -1; | ||
1830 | } | ||
1831 | i++; | ||
1832 | |||
1816 | for (j = 0; j < (unsigned int)argc; j++, i++) | 1833 | for (j = 0; j < (unsigned int)argc; j++, i++) |
1817 | rec_argv[i] = argv[j]; | 1834 | rec_argv[i] = argv[j]; |
1818 | 1835 | ||
@@ -2048,6 +2065,10 @@ static int trace__replay(struct trace *trace) | |||
2048 | 2065 | ||
2049 | evsel = perf_evlist__find_tracepoint_by_name(session->evlist, | 2066 | evsel = perf_evlist__find_tracepoint_by_name(session->evlist, |
2050 | "raw_syscalls:sys_enter"); | 2067 | "raw_syscalls:sys_enter"); |
2068 | /* older kernels have syscalls tp versus raw_syscalls */ | ||
2069 | if (evsel == NULL) | ||
2070 | evsel = perf_evlist__find_tracepoint_by_name(session->evlist, | ||
2071 | "syscalls:sys_enter"); | ||
2051 | if (evsel == NULL) { | 2072 | if (evsel == NULL) { |
2052 | pr_err("Data file does not have raw_syscalls:sys_enter event\n"); | 2073 | pr_err("Data file does not have raw_syscalls:sys_enter event\n"); |
2053 | goto out; | 2074 | goto out; |
@@ -2061,6 +2082,9 @@ static int trace__replay(struct trace *trace) | |||
2061 | 2082 | ||
2062 | evsel = perf_evlist__find_tracepoint_by_name(session->evlist, | 2083 | evsel = perf_evlist__find_tracepoint_by_name(session->evlist, |
2063 | "raw_syscalls:sys_exit"); | 2084 | "raw_syscalls:sys_exit"); |
2085 | if (evsel == NULL) | ||
2086 | evsel = perf_evlist__find_tracepoint_by_name(session->evlist, | ||
2087 | "syscalls:sys_exit"); | ||
2064 | if (evsel == NULL) { | 2088 | if (evsel == NULL) { |
2065 | pr_err("Data file does not have raw_syscalls:sys_exit event\n"); | 2089 | pr_err("Data file does not have raw_syscalls:sys_exit event\n"); |
2066 | goto out; | 2090 | goto out; |