aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorDavid Ahern <dsahern@gmail.com>2013-12-04 21:41:39 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-12-05 08:05:45 -0500
commit9aca7f1792c5d2d5d367bbe5cfe204fe40517929 (patch)
treec83ff78b2785e7598f2175890e723c8783e454b1 /tools/perf
parent6d65894bc028d0342829ea1e64c9e9efad571124 (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.c28
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;