From: Peter Zijlstra <peterz@infradead.org>
To: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Vince Weaver <vincent.weaver@maine.edu>,
Ingo Molnar <mingo@kernel.org>,
linux-kernel@vger.kernel.org,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Andy Lutomirski <luto@kernel.org>
Subject: Re: perf: fuzzer causes stack going in wrong direction warnings
Date: Thu, 10 May 2018 15:48:41 +0200 [thread overview]
Message-ID: <20180510134841.GE12217@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20180506234935.yq6zxjetlpldpzz7@treble>
On Sun, May 06, 2018 at 06:49:35PM -0500, Josh Poimboeuf wrote:
> Deja vu. Most of these are related to perf PEBS, similar to the
> following issue:
>
> b8000586c90b ("perf/x86/intel: Cure bogus unwind from PEBS entries")
>
> This is basically the ORC version of that. setup_pebs_sample_data() is
> assembling a franken-pt_regs which ORC isn't happy about. RIP is
> inconsistent with some of the other registers (like RSP and RBP).
>
> Peter, any ideas?
Urgh..
Something like so perhaps? It's a bit of a hack, but I couldn't quickly
think of something nicer.
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 707b2a96e516..86f0c15dcc2d 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -2997,6 +2997,9 @@ static int intel_pmu_hw_config(struct perf_event *event)
}
if (x86_pmu.pebs_aliases)
x86_pmu.pebs_aliases(event);
+
+ if (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN)
+ event->attr.sample_type |= __PERF_SAMPLE_CALLCHAIN_EARLY;
}
if (needs_branch_stack(event)) {
diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index 8a10a045b57b..2115ac8336b4 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -1183,17 +1183,21 @@ static void setup_pebs_sample_data(struct perf_event *event,
data->data_src.val = val;
}
+ /*
+ * We must however always use iregs for the unwinder to stay sane; the
+ * record BP,SP,IP can point into thin air when the record is from a
+ * previous PMI context or an (I)RET happend between the record and
+ * PMI.
+ */
+ if (sample_type & PERF_SAMPLE_CALLCHAIN)
+ data->callchain = perf_callchain(event, iregs);
+
/*
* We use the interrupt regs as a base because the PEBS record does not
* contain a full regs set, specifically it seems to lack segment
* descriptors, which get used by things like user_mode().
*
* In the simple case fix up only the IP for PERF_SAMPLE_IP.
- *
- * We must however always use BP,SP from iregs for the unwinder to stay
- * sane; the record BP,SP can point into thin air when the record is
- * from a previous PMI context or an (I)RET happend between the record
- * and PMI.
*/
*regs = *iregs;
@@ -1212,15 +1216,8 @@ static void setup_pebs_sample_data(struct perf_event *event,
regs->si = pebs->si;
regs->di = pebs->di;
- /*
- * Per the above; only set BP,SP if we don't need callchains.
- *
- * XXX: does this make sense?
- */
- if (!(sample_type & PERF_SAMPLE_CALLCHAIN)) {
- regs->bp = pebs->bp;
- regs->sp = pebs->sp;
- }
+ regs->bp = pebs->bp;
+ regs->sp = pebs->sp;
#ifndef CONFIG_X86_32
regs->r8 = pebs->r8;
diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
index b8e288a1f740..55b93cd0d48a 100644
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -143,6 +143,8 @@ enum perf_event_sample_format {
PERF_SAMPLE_PHYS_ADDR = 1U << 19,
PERF_SAMPLE_MAX = 1U << 20, /* non-ABI */
+
+ __PERF_SAMPLE_CALLCHAIN_EARLY = 1UL << 63,
};
/*
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 67612ce359ad..27c9e0f99f30 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -6380,7 +6380,9 @@ void perf_prepare_sample(struct perf_event_header *header,
if (sample_type & PERF_SAMPLE_CALLCHAIN) {
int size = 1;
- data->callchain = perf_callchain(event, regs);
+ if (!(sample_type & __PERF_SAMPLE_CALLCHAIN_EARLY))
+ data->callchain = perf_callchain(event, regs);
+
size += data->callchain->nr;
header->size += size * sizeof(u64);
next prev parent reply other threads:[~2018-05-10 13:48 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-08 16:12 perf: perf_fuzzer quickly locks up on 4.15-rc7 Vince Weaver
2018-01-08 17:30 ` Ingo Molnar
2018-01-08 20:29 ` Vince Weaver
2018-01-09 10:25 ` Peter Zijlstra
2018-01-09 13:26 ` Peter Zijlstra
2018-01-09 13:36 ` Peter Zijlstra
2018-01-09 13:44 ` Vince Weaver
2018-01-09 15:12 ` Peter Zijlstra
2018-01-09 15:24 ` Vince Weaver
2018-01-09 15:33 ` Peter Zijlstra
2018-01-09 15:56 ` Vince Weaver
2018-01-09 16:05 ` Peter Zijlstra
2018-01-09 17:07 ` Josh Poimboeuf
2018-01-11 5:25 ` Josh Poimboeuf
2018-01-11 19:00 ` Vince Weaver
2018-01-11 19:21 ` Josh Poimboeuf
2018-01-11 19:50 ` Peter Zijlstra
2018-01-11 19:57 ` Vince Weaver
2018-01-11 20:43 ` Vince Weaver
2018-05-01 13:29 ` perf: fuzzer causes stack going in wrong direction warnings Vince Weaver
2018-05-01 13:58 ` Josh Poimboeuf
2018-05-01 19:59 ` Vince Weaver
2018-05-01 22:04 ` Josh Poimboeuf
2018-05-02 20:50 ` Josh Poimboeuf
2018-05-04 14:35 ` Vince Weaver
2018-05-04 16:25 ` Josh Poimboeuf
2018-05-04 17:00 ` Vince Weaver
2018-05-05 15:38 ` Vince Weaver
2018-05-05 18:29 ` Josh Poimboeuf
2018-05-06 23:49 ` Josh Poimboeuf
2018-05-10 13:48 ` Peter Zijlstra [this message]
2018-05-10 14:27 ` Josh Poimboeuf
2018-05-10 23:16 ` Josh Poimboeuf
2018-01-09 16:16 ` perf: perf_fuzzer quickly locks up on 4.15-rc7 Ingo Molnar
2018-01-09 16:20 ` Peter Zijlstra
2018-01-09 17:18 ` Vince Weaver
2018-01-10 15:28 ` Vince Weaver
2018-01-09 16:14 ` Peter Zijlstra
2018-01-09 17:53 ` Steven Rostedt
2018-01-09 18:02 ` Peter Zijlstra
2018-01-09 18:09 ` Steven Rostedt
2018-01-09 19:53 ` Peter Zijlstra
2018-01-11 9:13 ` Peter Zijlstra
2018-01-11 15:26 ` Vince Weaver
2018-01-11 15:38 ` Peter Zijlstra
2018-01-11 16:41 ` Vince Weaver
2018-01-11 16:58 ` Vince Weaver
2018-01-11 17:03 ` Peter Zijlstra
2018-01-11 18:04 ` Vince Weaver
2018-01-11 18:20 ` Vince Weaver
2018-01-11 19:01 ` Peter Zijlstra
2018-01-11 19:11 ` Peter Zijlstra
2018-01-11 20:15 ` Vince Weaver
2018-01-11 20:40 ` Vince Weaver
2018-01-11 20:57 ` Peter Zijlstra
2018-01-12 19:48 ` Vince Weaver
2018-01-11 20:42 ` Peter Zijlstra
2018-01-11 15:29 ` Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180510134841.GE12217@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=acme@kernel.org \
--cc=jpoimboe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@kernel.org \
--cc=tglx@linutronix.de \
--cc=vincent.weaver@maine.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox