|
@@ -172,55 +172,6 @@ void cpuidle_reflect(struct cpuidle_device *dev, int index)
|
|
|
cpuidle_curr_governor->reflect(dev, index);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * cpuidle_idle_call - the main idle loop
|
|
|
- *
|
|
|
- * NOTE: no locks or semaphores should be used here
|
|
|
- * return non-zero on failure
|
|
|
- */
|
|
|
-int cpuidle_idle_call(void)
|
|
|
-{
|
|
|
- struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
|
|
|
- struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
|
|
|
- int next_state, entered_state, ret;
|
|
|
- bool broadcast;
|
|
|
-
|
|
|
- ret = cpuidle_enabled(drv, dev);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
-
|
|
|
- /* ask the governor for the next state */
|
|
|
- next_state = cpuidle_select(drv, dev);
|
|
|
-
|
|
|
- if (need_resched()) {
|
|
|
- dev->last_residency = 0;
|
|
|
- /* give the governor an opportunity to reflect on the outcome */
|
|
|
- cpuidle_reflect(dev, next_state);
|
|
|
- local_irq_enable();
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- broadcast = !!(drv->states[next_state].flags & CPUIDLE_FLAG_TIMER_STOP);
|
|
|
-
|
|
|
- if (broadcast &&
|
|
|
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu))
|
|
|
- return -EBUSY;
|
|
|
-
|
|
|
- trace_cpu_idle_rcuidle(next_state, dev->cpu);
|
|
|
-
|
|
|
- entered_state = cpuidle_enter(drv, dev, next_state);
|
|
|
-
|
|
|
- trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);
|
|
|
-
|
|
|
- if (broadcast)
|
|
|
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu);
|
|
|
-
|
|
|
- /* give the governor an opportunity to reflect on the outcome */
|
|
|
- cpuidle_reflect(dev, entered_state);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* cpuidle_install_idle_handler - installs the cpuidle idle loop handler
|
|
|
*/
|