[kernel/f15] Backport two upstream patches to fix rhbz 700718

Josh Boyer jwboyer at fedoraproject.org
Thu Sep 29 15:33:36 UTC 2011


commit ea166942be9f175b7ebd356fc64f67f36e03ff97
Author: Josh Boyer <jwboyer at redhat.com>
Date:   Thu Sep 29 11:00:15 2011 -0400

    Backport two upstream patches to fix rhbz 700718

 kernel.spec                                        |   13 +++-
 ...tack-from-regs-when-possible-in-dump_trac.patch |   86 ++++++++++++++++++++
 ...e-stack-pointer-in-perf-live-regs-savings.patch |   38 +++++++++
 3 files changed, 136 insertions(+), 1 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 8d4aca7..57843e0 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -705,6 +705,10 @@ Patch21013: Platform-fix-samsung-laptop-DMI-identification-for-N.patch
 
 Patch21014: block-Free-queue-resources-at-blk_release_queue.patch
 
+# rhbz #700718
+Patch21015: x86-Save-stack-pointer-in-perf-live-regs-savings.patch
+Patch21016: x86-Fetch-stack-from-regs-when-possible-in-dump_trac.patch
+
 %endif
 
 BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
@@ -1279,6 +1283,10 @@ ApplyPatch Platform-fix-samsung-laptop-DMI-identification-for-N.patch
 
 ApplyPatch block-Free-queue-resources-at-blk_release_queue.patch
 
+# rhbz #700718
+ApplyPatch x86-Save-stack-pointer-in-perf-live-regs-savings.patch
+ApplyPatch x86-Fetch-stack-from-regs-when-possible-in-dump_trac.patch
+
 # END OF PATCH APPLICATIONS
 
 %endif
@@ -1899,7 +1907,10 @@ fi
 # and build.
 
 %changelog
-* Wed Sep 28 2011 Josh Boyer <jwboyer at redhat.com> 2.6.40.4-6
+* Thu Sep 29 2011 Josh Boyer <jwboyer at redhat.com>
+- Backport two upstream patches to fix rhbz 700718
+
+* Wed Sep 28 2011 Josh Boyer <jwboyer at redhat.com>
 - Backport upstream block patch to try and fix a number of oopses we're seeing
   with USB drive removals
 - Update usb-add-quirk-for-logitech-webcams.patch (rhbz 742010)
diff --git a/x86-Fetch-stack-from-regs-when-possible-in-dump_trac.patch b/x86-Fetch-stack-from-regs-when-possible-in-dump_trac.patch
new file mode 100644
index 0000000..bda767a
--- /dev/null
+++ b/x86-Fetch-stack-from-regs-when-possible-in-dump_trac.patch
@@ -0,0 +1,86 @@
+From 47ce11a2b6519f9c7843223ea8e561eb71ea5896 Mon Sep 17 00:00:00 2001
+From: Frederic Weisbecker <fweisbec at gmail.com>
+Date: Thu, 30 Jun 2011 19:04:56 +0200
+Subject: [PATCH 2/2] x86: Fetch stack from regs when possible in dump_trace()
+
+When regs are passed to dump_stack(), we fetch the frame
+pointer from the regs but the stack pointer is taken from
+the current frame.
+
+Thus the frame and stack pointers may not come from the same
+context. For example this can result in the unwinder to
+think the context is in irq, due to the current value of
+the stack, but the frame pointer coming from the regs points
+to a frame from another place. It then tries to fix up
+the irq link but ends up dereferencing a random frame
+pointer that doesn't belong to the irq stack:
+
+[ 9131.706906] ------------[ cut here ]------------
+[ 9131.707003] WARNING: at arch/x86/kernel/dumpstack_64.c:129 dump_trace+0x2aa/0x330()
+[ 9131.707003] Hardware name: AMD690VM-FMH
+[ 9131.707003] Perf: bad frame pointer = 0000000000000005 in callchain
+[ 9131.707003] Modules linked in:
+[ 9131.707003] Pid: 1050, comm: perf Not tainted 3.0.0-rc3+ #181
+[ 9131.707003] Call Trace:
+[ 9131.707003]  <IRQ>  [<ffffffff8104bd4a>] warn_slowpath_common+0x7a/0xb0
+[ 9131.707003]  [<ffffffff8104be21>] warn_slowpath_fmt+0x41/0x50
+[ 9131.707003]  [<ffffffff8178b873>] ? bad_to_user+0x6d/0x10be
+[ 9131.707003]  [<ffffffff8100c2da>] dump_trace+0x2aa/0x330
+[ 9131.707003]  [<ffffffff810107d3>] ? native_sched_clock+0x13/0x50
+[ 9131.707003]  [<ffffffff8101b164>] perf_callchain_kernel+0x54/0x70
+[ 9131.707003]  [<ffffffff810d391f>] perf_prepare_sample+0x19f/0x2a0
+[ 9131.707003]  [<ffffffff810d546c>] __perf_event_overflow+0x16c/0x290
+[ 9131.707003]  [<ffffffff810d5430>] ? __perf_event_overflow+0x130/0x290
+[ 9131.707003]  [<ffffffff810107d3>] ? native_sched_clock+0x13/0x50
+[ 9131.707003]  [<ffffffff8100fbb9>] ? sched_clock+0x9/0x10
+[ 9131.707003]  [<ffffffff810752e5>] ? T.375+0x15/0x90
+[ 9131.707003]  [<ffffffff81084da4>] ? trace_hardirqs_on_caller+0x64/0x180
+[ 9131.707003]  [<ffffffff810817bd>] ? trace_hardirqs_off+0xd/0x10
+[ 9131.707003]  [<ffffffff810d5764>] perf_event_overflow+0x14/0x20
+[ 9131.707003]  [<ffffffff810d588c>] perf_swevent_hrtimer+0x11c/0x130
+[ 9131.707003]  [<ffffffff817821a1>] ? error_exit+0x51/0xb0
+[ 9131.707003]  [<ffffffff81072e93>] __run_hrtimer+0x83/0x1e0
+[ 9131.707003]  [<ffffffff810d5770>] ? perf_event_overflow+0x20/0x20
+[ 9131.707003]  [<ffffffff81073256>] hrtimer_interrupt+0x106/0x250
+[ 9131.707003]  [<ffffffff812a3bfd>] ? trace_hardirqs_off_thunk+0x3a/0x3c
+[ 9131.707003]  [<ffffffff81024833>] smp_apic_timer_interrupt+0x53/0x90
+[ 9131.707003]  [<ffffffff81789053>] apic_timer_interrupt+0x13/0x20
+[ 9131.707003]  <EOI>  [<ffffffff817821a1>] ? error_exit+0x51/0xb0
+[ 9131.707003]  [<ffffffff8178219c>] ? error_exit+0x4c/0xb0
+[ 9131.707003] ---[ end trace b2560d4876709347 ]---
+
+Fix this by simply taking the stack pointer from regs->sp
+when regs are provided.
+
+Signed-off-by: Frederic Weisbecker <fweisbec at gmail.com>
+Cc: Ingo Molnar <mingo at elte.hu>
+Cc: Thomas Gleixner <tglx at linutronix.de>
+Cc: H. Peter Anvin <hpa at zytor.com>
+Cc: Peter Zijlstra <a.p.zijlstra at chello.nl>
+Cc: Arnaldo Carvalho de Melo <acme at redhat.com>
+---
+ arch/x86/kernel/dumpstack_64.c |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
+index e71c98d..788295c 100644
+--- a/arch/x86/kernel/dumpstack_64.c
++++ b/arch/x86/kernel/dumpstack_64.c
+@@ -155,9 +155,12 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
+ 		task = current;
+ 
+ 	if (!stack) {
+-		stack = &dummy;
+-		if (task && task != current)
++		if (regs)
++			stack = (unsigned long *)regs->sp;
++		else if (task && task != current)
+ 			stack = (unsigned long *)task->thread.sp;
++		else
++			stack = &dummy;
+ 	}
+ 
+ 	if (!bp)
+-- 
+1.7.6
+
diff --git a/x86-Save-stack-pointer-in-perf-live-regs-savings.patch b/x86-Save-stack-pointer-in-perf-live-regs-savings.patch
new file mode 100644
index 0000000..3964f10
--- /dev/null
+++ b/x86-Save-stack-pointer-in-perf-live-regs-savings.patch
@@ -0,0 +1,38 @@
+From 9e46294dadedc0c04adcb8ce760bd2cd74f7332d Mon Sep 17 00:00:00 2001
+From: Frederic Weisbecker <fweisbec at gmail.com>
+Date: Sat, 2 Jul 2011 15:00:52 +0200
+Subject: [PATCH 1/2] x86: Save stack pointer in perf live regs savings
+
+In order to prepare for fetching the stack pointer from the
+regs when possible in dump_trace() instead of taking the
+local one, save the current stack pointer in perf live regs saving.
+
+Signed-off-by: Frederic Weisbecker <fweisbec at gmail.com>
+Cc: Ingo Molnar <mingo at elte.hu>
+Cc: Thomas Gleixner <tglx at linutronix.de>
+Cc: H. Peter Anvin <hpa at zytor.com>
+Cc: Peter Zijlstra <a.p.zijlstra at chello.nl>
+Cc: Arnaldo Carvalho de Melo <acme at redhat.com>
+---
+ arch/x86/include/asm/perf_event.h |    5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h
+index d9d4dae..094fb30 100644
+--- a/arch/x86/include/asm/perf_event.h
++++ b/arch/x86/include/asm/perf_event.h
+@@ -152,6 +152,11 @@ extern unsigned long perf_misc_flags(struct pt_regs *regs);
+ 	(regs)->bp = caller_frame_pointer();			\
+ 	(regs)->cs = __KERNEL_CS;				\
+ 	regs->flags = 0;					\
++	asm volatile(						\
++		_ASM_MOV "%%"_ASM_SP ", %0\n"			\
++		: "=m" ((regs)->sp)				\
++		:: "memory"					\
++	);							\
+ }
+ 
+ #else
+-- 
+1.7.6
+


More information about the scm-commits mailing list