[kernel/f19] Fix backtrace in amd_e400_idle (rhbz 1031296)

Josh Boyer jwboyer at fedoraproject.org
Wed Feb 12 15:22:39 UTC 2014


commit 3ce71edd261301596996bcfab0c9d974e8a679e2
Author: Josh Boyer <jwboyer at fedoraproject.org>
Date:   Wed Feb 12 10:21:12 2014 -0500

    Fix backtrace in amd_e400_idle (rhbz 1031296)

 kernel.spec                                        |    7 ++
 ...ast-pending-bit-when-switching-to-oneshot.patch |   88 ++++++++++++++++++++
 2 files changed, 95 insertions(+), 0 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 5c44704..7baf54c 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -773,6 +773,9 @@ Patch25186: xhci-fix-resume-issues-on-renesas-chips-in-samsung-laptops.patch
 #CVE-2014-1874 rhbz 1062356 1062507
 Patch25188: SELinux-Fix-kernel-BUG-on-empty-security-contexts.patch
 
+#rhbz 1031296
+Patch25189: tick-Clear-broadcast-pending-bit-when-switching-to-oneshot.patch
+
 # END OF PATCH DEFINITIONS
 
 %endif
@@ -1485,6 +1488,9 @@ ApplyPatch xhci-fix-resume-issues-on-renesas-chips-in-samsung-laptops.patch
 #CVE-2014-1874 rhbz 1062356 1062507
 ApplyPatch SELinux-Fix-kernel-BUG-on-empty-security-contexts.patch
 
+#rhbz 1031296
+ApplyPatch tick-Clear-broadcast-pending-bit-when-switching-to-oneshot.patch
+
 # END OF PATCH APPLICATIONS
 
 %endif
@@ -2298,6 +2304,7 @@ fi
 
 %changelog
 * Wed Feb 12 2014 Josh Boyer <jwboyer at fedoraproject.org>
+- Fix backtrace in amd_e400_idle (rhbz 1031296)
 - CVE-2014-1874 SELinux: local denial of service (rhbz 1062356 1062507)
 
 * Thu Feb 06 2014 Justin M. Forbes <jforbes at fedoraproject.org> - 3.12.10-200
diff --git a/tick-Clear-broadcast-pending-bit-when-switching-to-oneshot.patch b/tick-Clear-broadcast-pending-bit-when-switching-to-oneshot.patch
new file mode 100644
index 0000000..a0d58cf
--- /dev/null
+++ b/tick-Clear-broadcast-pending-bit-when-switching-to-oneshot.patch
@@ -0,0 +1,88 @@
+On Mon, 10 Feb 2014, Thomas Gleixner wrote:
+> On Mon, 10 Feb 2014, poma wrote:
+> 
+> > [   83.558551]  [<ffffffff81025b17>] amd_e400_idle+0x87/0x130
+> 
+> So this seems to happen only on AMD machines which use that e400 idle
+> mode. I have no idea at the moment whats wrong there. I'll find one of
+> those machines and try to reproduce.
+
+Found it. Patch below.
+
+Thanks,
+
+	tglx
+----
+Subject: tick: Clear broadcast pending bit when switching to oneshot
+From: Thomas Gleixner <tglx at linutronix.de>
+Date: Tue, 11 Feb 2014 14:35:40 +0100
+
+AMD systems which use the C1E workaround in the amd_e400_idle routine
+trigger the WARN_ON_ONCE in the broadcast code when onlining a CPU.
+
+The reason is that the idle routine of those AMD systems switches the
+cpu into forced broadcast mode early on before the newly brought up
+CPU can switch over to high resolution / NOHZ mode. The timer related
+CPU1 bringup looks like this:
+
+  clockevent_register_device(local_apic);
+  tick_setup(local_apic);
+  ...
+  idle()
+	tick_broadcast_on_off(FORCE);
+	tick_broadcast_oneshot_control(ENTER)
+	  cpumask_set(cpu, broadcast_oneshot_mask);
+	halt();
+
+Now the broadcast interrupt on CPU0 sets CPU1 in the
+broadcast_pending_mask and wakes CPU1. So CPU1 continues:
+
+	local_apic_timer_interrupt()
+	   tick_handle_periodic();
+	   softirq()
+	     tick_init_highres();
+	       cpumask_clr(cpu, broadcast_oneshot_mask);
+	
+	tick_broadcast_oneshot_control(ENTER)
+	   WARN_ON(cpumask_test(cpu, broadcast_pending_mask);
+
+So while we remove CPU1 from the broadcast_oneshot_mask when we switch
+over to highres mode, we do not clear the pending bit, which then
+triggers the warning when we go back to idle.
+
+The reason why this is only visible on C1E affected AMD systems is
+that the other machines enter the deep sleep states via
+acpi_idle/intel_idle and exit the broadcast mode before executing the
+remote triggered local_apic_timer_interrupt. So the pending bit is
+already cleared when the switch over to highres mode is clearing the
+oneshot mask.
+
+The solution is simple: Clear the pending bit together with the mask
+bit when we switch over to highres mode.
+
+Reported-by: poma <pomidorabelisima at gmail.com>
+Cc: stable at vger.kernel.org # 3.10+
+Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
+---
+ kernel/time/tick-broadcast.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+Index: linux-2.6/kernel/time/tick-broadcast.c
+===================================================================
+--- linux-2.6.orig/kernel/time/tick-broadcast.c
++++ linux-2.6/kernel/time/tick-broadcast.c
+@@ -756,6 +756,7 @@ out:
+ static void tick_broadcast_clear_oneshot(int cpu)
+ {
+ 	cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask);
++	cpumask_clear_cpu(cpu, tick_broadcast_pending_mask);
+ }
+ 
+ static void tick_broadcast_init_next_event(struct cpumask *mask,
+
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo at vger.kernel.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at  http://www.tux.org/lkml/
\ No newline at end of file


More information about the scm-commits mailing list