Messages in this thread | | | Date | Tue, 19 Mar 2013 13:50:08 +0100 | Subject | Re: [PATCH] perf,x86: fix uninitialized pt_regs in intel_pmu_drain_bts_buffer() | From | Stephane Eranian <> |
| |
On Tue, Mar 19, 2013 at 1:43 PM, Peter Zijlstra <peterz@infradead.org> wrote: > On Mon, 2013-03-18 at 14:46 +0100, Stephane Eranian wrote: >> >> This patch fixes an uninitialized pt_regs struct in drain BTS >> function. The pt_regs struct is propagated all the way to the >> code_get_segment() function from perf_instruction_pointer() >> and may get garbage. >> >> We cannot simply inherit the actual pt_regs from the interrupt >> because BTS must be flushed on context-switch or when the associated >> event is disabled. And there we do not have a pt_regs handy. >> >> Setting pt_regs to all zeroes may not be the best option but it is >> not clear what else to do given where the drain_bts_buffer() is called >> from. >> >> Signed-off-by: Stephane Eranian <eranian@google.com> >> --- >> >> diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c >> index b05a575..208f0c8 100644 >> --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c >> +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c >> @@ -302,6 +302,8 @@ int intel_pmu_drain_bts_buffer(void) >> struct perf_sample_data data; >> struct pt_regs regs; >> >> + memset(®s, 0, sizeof(regs)); >> + >> if (!event) >> return 0; >> > > Should we not replace: > > regs.ip = 0; > > with that memset? It avoids the memset work in a few cases and removes > the then superfluous clearing of the IP field. > We could drop it because it's covered by the memset().
The issue here was that you eventually end up in code_segment_base() which looks at other uninitialized fields in pt_regs and may cause breakage.
| |