|
@@ -102,6 +102,34 @@ int cpuidle_play_dead(void)
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * cpuidle_enter_state - enter the state and update stats
|
|
|
+ * @dev: cpuidle device for this cpu
|
|
|
+ * @drv: cpuidle driver for this cpu
|
|
|
+ * @next_state: index into drv->states of the state to enter
|
|
|
+ */
|
|
|
+int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv,
|
|
|
+ int next_state)
|
|
|
+{
|
|
|
+ int entered_state;
|
|
|
+
|
|
|
+ entered_state = cpuidle_enter_ops(dev, drv, next_state);
|
|
|
+
|
|
|
+ if (entered_state >= 0) {
|
|
|
+ /* Update cpuidle counters */
|
|
|
+ /* This can be moved to within driver enter routine
|
|
|
+ * but that results in multiple copies of same code.
|
|
|
+ */
|
|
|
+ dev->states_usage[entered_state].time +=
|
|
|
+ (unsigned long long)dev->last_residency;
|
|
|
+ dev->states_usage[entered_state].usage++;
|
|
|
+ } else {
|
|
|
+ dev->last_residency = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return entered_state;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* cpuidle_idle_call - the main idle loop
|
|
|
*
|
|
@@ -143,23 +171,11 @@ int cpuidle_idle_call(void)
|
|
|
trace_power_start_rcuidle(POWER_CSTATE, next_state, dev->cpu);
|
|
|
trace_cpu_idle_rcuidle(next_state, dev->cpu);
|
|
|
|
|
|
- entered_state = cpuidle_enter_ops(dev, drv, next_state);
|
|
|
+ entered_state = cpuidle_enter_state(dev, drv, next_state);
|
|
|
|
|
|
trace_power_end_rcuidle(dev->cpu);
|
|
|
trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);
|
|
|
|
|
|
- if (entered_state >= 0) {
|
|
|
- /* Update cpuidle counters */
|
|
|
- /* This can be moved to within driver enter routine
|
|
|
- * but that results in multiple copies of same code.
|
|
|
- */
|
|
|
- dev->states_usage[entered_state].time +=
|
|
|
- (unsigned long long)dev->last_residency;
|
|
|
- dev->states_usage[entered_state].usage++;
|
|
|
- } else {
|
|
|
- dev->last_residency = 0;
|
|
|
- }
|
|
|
-
|
|
|
/* give the governor an opportunity to reflect on the outcome */
|
|
|
if (cpuidle_curr_governor->reflect)
|
|
|
cpuidle_curr_governor->reflect(dev, entered_state);
|