aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-10-13 12:20:39 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-10-13 12:20:39 -0400
commitf1d0d14120a8a6224a8aead925cf4310f48947d5 (patch)
tree434b4cfbaa6af2d60861dda334f785d7a335fe31
parentbf10fa857f0604865006d9705e63415b9d4e0d62 (diff)
parent2ed53c0d6cc99fc712f7c037e41d9ec4eb8d6b08 (diff)
Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 cpu offlining patch from Ingo Molnar: "This tree includes a single commit that speeds up x86 suspend/resume by replacing a naive 100msec sleep based polling loop with proper completion notification. This gives some real suspend/resume benefit on servers with larger core counts" * 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/smpboot: Speed up suspend/resume by avoiding 100ms sleep for CPU offline during S3
-rw-r--r--arch/x86/kernel/smpboot.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 1c3443d98105..2d5200e56357 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -102,6 +102,8 @@ DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_llc_shared_map);
102DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info); 102DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info);
103EXPORT_PER_CPU_SYMBOL(cpu_info); 103EXPORT_PER_CPU_SYMBOL(cpu_info);
104 104
105static DEFINE_PER_CPU(struct completion, die_complete);
106
105atomic_t init_deasserted; 107atomic_t init_deasserted;
106 108
107/* 109/*
@@ -1325,26 +1327,24 @@ int native_cpu_disable(void)
1325 return ret; 1327 return ret;
1326 1328
1327 clear_local_APIC(); 1329 clear_local_APIC();
1328 1330 init_completion(&per_cpu(die_complete, smp_processor_id()));
1329 cpu_disable_common(); 1331 cpu_disable_common();
1332
1330 return 0; 1333 return 0;
1331} 1334}
1332 1335
1333void native_cpu_die(unsigned int cpu) 1336void native_cpu_die(unsigned int cpu)
1334{ 1337{
1335 /* We don't do anything here: idle task is faking death itself. */ 1338 /* We don't do anything here: idle task is faking death itself. */
1336 unsigned int i; 1339 wait_for_completion_timeout(&per_cpu(die_complete, cpu), HZ);
1337 1340
1338 for (i = 0; i < 10; i++) { 1341 /* They ack this in play_dead() by setting CPU_DEAD */
1339 /* They ack this in play_dead by setting CPU_DEAD */ 1342 if (per_cpu(cpu_state, cpu) == CPU_DEAD) {
1340 if (per_cpu(cpu_state, cpu) == CPU_DEAD) { 1343 if (system_state == SYSTEM_RUNNING)
1341 if (system_state == SYSTEM_RUNNING) 1344 pr_info("CPU %u is now offline\n", cpu);
1342 pr_info("CPU %u is now offline\n", cpu); 1345 } else {
1343 return; 1346 pr_err("CPU %u didn't die...\n", cpu);
1344 }
1345 msleep(100);
1346 } 1347 }
1347 pr_err("CPU %u didn't die...\n", cpu);
1348} 1348}
1349 1349
1350void play_dead_common(void) 1350void play_dead_common(void)
@@ -1356,6 +1356,7 @@ void play_dead_common(void)
1356 mb(); 1356 mb();
1357 /* Ack it */ 1357 /* Ack it */
1358 __this_cpu_write(cpu_state, CPU_DEAD); 1358 __this_cpu_write(cpu_state, CPU_DEAD);
1359 complete(&per_cpu(die_complete, smp_processor_id()));
1359 1360
1360 /* 1361 /*
1361 * With physical CPU hotplug, we should halt the cpu 1362 * With physical CPU hotplug, we should halt the cpu