[3.13.y.z extended stable] Patch "x86, tsc: Fix cpufreq lockup" has been added to staging queue

Kamal Mostafa kamal at canonical.com
Wed Aug 6 20:54:35 UTC 2014


This is a note to let you know that I have just added a patch titled

    x86, tsc: Fix cpufreq lockup

to the linux-3.13.y-queue branch of the 3.13.y.z extended stable tree 
which can be found at:

 http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.13.y-queue

This patch is scheduled to be released in version 3.13.11.6.

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.13.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable

Thanks.
-Kamal

------

>From 0c163f7d8b127903f45ebc8d47557b9bcfab8274 Mon Sep 17 00:00:00 2001
From: Peter Zijlstra <peterz at infradead.org>
Date: Tue, 24 Jun 2014 14:48:19 +0200
Subject: x86, tsc: Fix cpufreq lockup

commit 3896c329df8092661dac80f55a8c3f60136fd61a upstream.

Mauro reported that his AMD X2 using the powernow-k8 cpufreq driver
locked up when doing cpu hotplug.

Because we called set_cyc2ns_scale() from the time_cpufreq_notifier()
unconditionally, it gets called multiple times for each freq change,
instead of only the once, when the tsc_khz value actually changes.

Because it gets called more than once, we run out of cyc2ns data slots
and stall, waiting for a free one, but because we're half way offline,
there's no consumers to free slots.

By placing the call inside the condition that actually changes tsc_khz
we avoid superfluous calls and avoid the problem.

Reported-by: Mauro <registosites at hotmail.com>
Tested-by: Mauro <registosites at hotmail.com>
Fixes: 20d1c86a5776 ("sched/clock, x86: Rewrite cyc2ns() to avoid the need to disable IRQs")
Cc: "Rafael J. Wysocki" <rjw at rjwysocki.net>
Cc: Viresh Kumar <viresh.kumar at linaro.org>
Cc: Bin Gao <bin.gao at intel.com>
Cc: Linus Torvalds <torvalds at linux-foundation.org>
Cc: Mika Westerberg <mika.westerberg at linux.intel.com>
Cc: Paul Gortmaker <paul.gortmaker at windriver.com>
Cc: Stefani Seibold <stefani at seibold.net>
Cc: linux-kernel at vger.kernel.org
Signed-off-by: Peter Zijlstra <peterz at infradead.org>
Signed-off-by: Ingo Molnar <mingo at kernel.org>
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
---
 arch/x86/kernel/tsc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 930e5d4..66af9af 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -722,9 +722,9 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
 		tsc_khz = cpufreq_scale(tsc_khz_ref, ref_freq, freq->new);
 		if (!(freq->flags & CPUFREQ_CONST_LOOPS))
 			mark_tsc_unstable("cpufreq changes");
-	}

-	set_cyc2ns_scale(tsc_khz, freq->cpu);
+		set_cyc2ns_scale(tsc_khz, freq->cpu);
+	}

 	return 0;
 }
--
1.9.1





More information about the kernel-team mailing list