[ 3.8.y.z extended stable ] Patch "powerpc: Default arch idle could cede processor on pseries" has been added to staging queue

Kamal Mostafa kamal at canonical.com
Fri Sep 20 00:36:29 UTC 2013

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

    powerpc: Default arch idle could cede processor on pseries

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


This patch is scheduled to be released in version

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.8.y.z tree, see



>From f7c40573ee5d2dd47c390481703949c85eaf30d2 Mon Sep 17 00:00:00 2001
From: Vaidyanathan Srinivasan <svaidy at linux.vnet.ibm.com>
Date: Fri, 6 Sep 2013 00:25:06 +0530
Subject: powerpc: Default arch idle could cede processor on pseries

commit 363edbe2614aa90df706c0f19ccfa2a6c06af0be upstream.

When adding cpuidle support to pSeries, we introduced two

  - The new cpuidle backend driver only works under hypervisors
    supporting the "SLPLAR" option, which isn't the case of the
    old POWER4 hypervisor and the HV "light" used on js2x blades

  - The cpuidle driver registers fairly late, meaning that for
    a significant portion of the boot process, we end up having
    all threads spinning. This slows down the boot process and
    increases the overall resource usage if the hypervisor has
    shared processors.

This fixes both by implementing a "default" idle that will cede
to the hypervisor when possible, in a very simple way without
all the bells and whisles of cpuidle.

Reported-by: Paul Mackerras <paulus at samba.org>
Signed-off-by: Vaidyanathan Srinivasan <svaidy at linux.vnet.ibm.com>
Acked-by: Deepthi Dharwar <deepthi at linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
 arch/powerpc/platforms/pseries/setup.c | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index ca55882..28f6ccd 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -353,7 +353,7 @@ static int alloc_dispatch_log_kmem_cache(void)

-static void pSeries_idle(void)
+static void pseries_lpar_idle(void)
 	/* This would call on the cpuidle framework, and the back-end pseries
 	 * driver to  go to idle states
@@ -361,10 +361,22 @@ static void pSeries_idle(void)
 	if (cpuidle_idle_call()) {
 		/* On error, execute default handler
 		 * to go into low thread priority and possibly
-		 * low power mode.
+		 * low power mode by cedeing processor to hypervisor
-		HMT_low();
-		HMT_very_low();
+		/* Indicate to hypervisor that we are idle. */
+		get_lppaca()->idle = 1;
+		/*
+		 * Yield the processor to the hypervisor.  We return if
+		 * an external interrupt occurs (which are driven prior
+		 * to returning here) or if a prod occurs from another
+		 * processor. When returning here, external interrupts
+		 * are enabled.
+		 */
+		cede_processor();
+		get_lppaca()->idle = 0;

@@ -453,15 +465,14 @@ static void __init pSeries_setup_arch(void)


-	if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
+	if (firmware_has_feature(FW_FEATURE_LPAR)) {
-		ppc_md.power_save = pSeries_idle;
-	}
-	if (firmware_has_feature(FW_FEATURE_LPAR))
+		ppc_md.power_save = pseries_lpar_idle;
 		ppc_md.enable_pmcs = pseries_lpar_enable_pmcs;
-	else
+	} else {
+		/* No special idle routine */
 		ppc_md.enable_pmcs = power4_enable_pmcs;
+	}

 	if (firmware_has_feature(FW_FEATURE_SET_MODE)) {
 		long rc;

More information about the kernel-team mailing list