public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] X86/CPU: Avoid 100ms sleep for cpu offline  during S3
@ 2014-08-04  8:59 Lan Tianyu
  2014-08-04 10:23 ` Borislav Petkov
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Lan Tianyu @ 2014-08-04  8:59 UTC (permalink / raw)
  To: tglx, mingo, hpa, x86, toshi.kani, imammedo, bp, jan.kiszka,
	tianyu.lan
  Cc: mingo, huawei.libin, prarit, linux-kernel

Some test result shows cpu offline consumes more than 100ms during S3.
After some researchs, found native_cpu_die() would fall into 100ms
sleep if cpu idle loop thread marked cpu state slower. What native_cpu_die()
does is that poll cpu state and wait for 100ms if cpu state hasn't been marked
to DEAD. The 100ms sleep doesn't make sense. To avoid such long sleep, this
patch is to add struct completion to each cpu, wait for the completion
in the native_cpu_die() and wakeup the completion when the cpu state is
marked to DEAD.

Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
---
 arch/x86/kernel/smpboot.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 5492798..15d9d9f 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -102,6 +102,9 @@ DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_llc_shared_map);
 DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info);
 EXPORT_PER_CPU_SYMBOL(cpu_info);
 
+DEFINE_PER_CPU(struct completion, die_complete);
+
+
 atomic_t init_deasserted;
 
 /*
@@ -1331,7 +1334,7 @@ int native_cpu_disable(void)
 		return ret;
 
 	clear_local_APIC();
-
+	init_completion(&per_cpu(die_complete, smp_processor_id()));
 	cpu_disable_common();
 	return 0;
 }
@@ -1339,18 +1342,16 @@ int native_cpu_disable(void)
 void native_cpu_die(unsigned int cpu)
 {
 	/* We don't do anything here: idle task is faking death itself. */
-	unsigned int i;
+	wait_for_completion_timeout(&per_cpu(die_complete, cpu),
+			msecs_to_jiffies(1000));
 
-	for (i = 0; i < 10; i++) {
-		/* They ack this in play_dead by setting CPU_DEAD */
-		if (per_cpu(cpu_state, cpu) == CPU_DEAD) {
-			if (system_state == SYSTEM_RUNNING)
-				pr_info("CPU %u is now offline\n", cpu);
-			return;
-		}
-		msleep(100);
-	}
-	pr_err("CPU %u didn't die...\n", cpu);
+	/* They ack this in play_dead by setting CPU_DEAD */
+	if (per_cpu(cpu_state, cpu) == CPU_DEAD) {
+		if (system_state == SYSTEM_RUNNING)
+			pr_info("CPU %u is now offline\n", cpu);
+		return;
+	} else
+		pr_err("CPU %u didn't die...\n", cpu);
 }
 
 void play_dead_common(void)
@@ -1362,6 +1363,7 @@ void play_dead_common(void)
 	mb();
 	/* Ack it */
 	__this_cpu_write(cpu_state, CPU_DEAD);
+	complete(&per_cpu(die_complete, smp_processor_id()));
 
 	/*
 	 * With physical CPU hotplug, we should halt the cpu
-- 
1.8.4.rc0.1.g8f6a3e5.dirty


^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2014-08-12 11:36 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-04  8:59 [PATCH] X86/CPU: Avoid 100ms sleep for cpu offline during S3 Lan Tianyu
2014-08-04 10:23 ` Borislav Petkov
     [not found]   ` <53E04457.2060507@intel.com>
2014-08-05  7:54     ` Borislav Petkov
2014-08-05  9:29       ` Lan Tianyu
2014-08-06 11:07         ` Borislav Petkov
2014-08-06 13:13           ` Lan, Tianyu
2014-08-06 13:57             ` Gene Heskett
2014-08-07  8:47               ` Lan Tianyu
2014-08-07 10:23                 ` Gene Heskett
2014-08-06 16:06             ` Borislav Petkov
2014-08-07  8:56               ` Lan Tianyu
2014-08-05  8:41 ` Borislav Petkov
2014-08-05  9:28   ` Lan Tianyu
2014-08-12  7:31 ` [PATCH V2] " Lan Tianyu
2014-08-12  7:55   ` Borislav Petkov
2014-08-12 11:36   ` Prarit Bhargava

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox