cpuidle: Set polling in poll_idle
authorAndy Lutomirski <luto@amacapital.net>
Wed, 4 Jun 2014 17:31:14 +0000 (10:31 -0700)
committerIngo Molnar <mingo@kernel.org>
Thu, 5 Jun 2014 10:09:49 +0000 (12:09 +0200)
poll_idle is the archetypal polling idle loop; tell the core idle
code about it.

This avoids pointless IPIs when all of the other cpuidle states are
disabled.

Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: nicolas.pitre@linaro.org
Cc: umgwanakikbuti@gmail.com
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: linux-kernel@vger.kernel.org
Cc: linux-pm@vger.kernel.org
Link: http://lkml.kernel.org/r/c65ce49615d338bae8fb79df5daffab19353c900.1401902905.git.luto@amacapital.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
drivers/cpuidle/driver.c

index 136d6a283e0a3818846eab4e78e7e9245b7d6f07..9634f20e392611b32349aaa348aa3980f2344ecd 100644 (file)
@@ -187,8 +187,11 @@ static int poll_idle(struct cpuidle_device *dev,
 
        t1 = ktime_get();
        local_irq_enable();
-       while (!need_resched())
-               cpu_relax();
+       if (!current_set_polling_and_test()) {
+               while (!need_resched())
+                       cpu_relax();
+       }
+       current_clr_polling();
 
        t2 = ktime_get();
        diff = ktime_to_us(ktime_sub(t2, t1));