aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2014-07-22 09:17:10 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-07-23 10:12:59 -0400
commitdeaff8b659cf4d34181c087b8cdf74f1eb17b02b (patch)
treec8ea4c936701091f4bc8a238fe8cbbe5d6d560de
parenta6f6ae99f12e8154d5cde6e8366fc228f68d6ae5 (diff)
perf tools: Fix jump label always changing during tracing
Intel PT decoding walks the object code to reconstruct the trace. A jump label change during tracing causes decoding errors. The "Enable close-on-exec flag on perf file descriptor" patch caused there to be always a jump label change. It was found that using a per-cpu context instead of a per-thread context for the probe of the close-on-exec feature, made the problem go away. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1406035081-14301-2-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/util/cloexec.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/tools/perf/util/cloexec.c b/tools/perf/util/cloexec.c
index c5d05ec17220..6a37be53a5d2 100644
--- a/tools/perf/util/cloexec.c
+++ b/tools/perf/util/cloexec.c
@@ -1,3 +1,4 @@
1#include <sched.h>
1#include "util.h" 2#include "util.h"
2#include "../perf.h" 3#include "../perf.h"
3#include "cloexec.h" 4#include "cloexec.h"
@@ -14,9 +15,13 @@ static int perf_flag_probe(void)
14 }; 15 };
15 int fd; 16 int fd;
16 int err; 17 int err;
18 int cpu = sched_getcpu();
19
20 if (cpu < 0)
21 cpu = 0;
17 22
18 /* check cloexec flag */ 23 /* check cloexec flag */
19 fd = sys_perf_event_open(&attr, 0, -1, -1, 24 fd = sys_perf_event_open(&attr, -1, cpu, -1,
20 PERF_FLAG_FD_CLOEXEC); 25 PERF_FLAG_FD_CLOEXEC);
21 err = errno; 26 err = errno;
22 27
@@ -30,7 +35,7 @@ static int perf_flag_probe(void)
30 err, strerror(err)); 35 err, strerror(err));
31 36
32 /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */ 37 /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */
33 fd = sys_perf_event_open(&attr, 0, -1, -1, 0); 38 fd = sys_perf_event_open(&attr, -1, cpu, -1, 0);
34 err = errno; 39 err = errno;
35 40
36 if (WARN_ONCE(fd < 0, 41 if (WARN_ONCE(fd < 0,