aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpuidle
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpuidle')
-rw-r--r--drivers/cpuidle/cpuidle.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index ee9df5e3f5eb..125150dc6e81 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -223,8 +223,14 @@ void cpuidle_uninstall_idle_handler(void)
223{ 223{
224 if (enabled_devices) { 224 if (enabled_devices) {
225 initialized = 0; 225 initialized = 0;
226 kick_all_cpus_sync(); 226 wake_up_all_idle_cpus();
227 } 227 }
228
229 /*
230 * Make sure external observers (such as the scheduler)
231 * are done looking at pointed idle states.
232 */
233 synchronize_rcu();
228} 234}
229 235
230/** 236/**
@@ -530,11 +536,6 @@ EXPORT_SYMBOL_GPL(cpuidle_register);
530 536
531#ifdef CONFIG_SMP 537#ifdef CONFIG_SMP
532 538
533static void smp_callback(void *v)
534{
535 /* we already woke the CPU up, nothing more to do */
536}
537
538/* 539/*
539 * This function gets called when a part of the kernel has a new latency 540 * This function gets called when a part of the kernel has a new latency
540 * requirement. This means we need to get all processors out of their C-state, 541 * requirement. This means we need to get all processors out of their C-state,
@@ -544,7 +545,7 @@ static void smp_callback(void *v)
544static int cpuidle_latency_notify(struct notifier_block *b, 545static int cpuidle_latency_notify(struct notifier_block *b,
545 unsigned long l, void *v) 546 unsigned long l, void *v)
546{ 547{
547 smp_call_function(smp_callback, NULL, 1); 548 wake_up_all_idle_cpus();
548 return NOTIFY_OK; 549 return NOTIFY_OK;
549} 550}
550 551