|
@@ -288,7 +288,7 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
|
|
struct menu_device *data = &__get_cpu_var(menu_devices);
|
|
|
int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);
|
|
|
int i;
|
|
|
- int multiplier;
|
|
|
+ unsigned int interactivity_req;
|
|
|
struct timespec t;
|
|
|
|
|
|
if (data->needs_update) {
|
|
@@ -310,8 +310,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
|
|
|
|
|
data->bucket = which_bucket(data->next_timer_us);
|
|
|
|
|
|
- multiplier = performance_multiplier();
|
|
|
-
|
|
|
/*
|
|
|
* if the correction factor is 0 (eg first time init or cpu hotplug
|
|
|
* etc), we actually want to start out with a unity factor.
|
|
@@ -330,6 +328,15 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
|
|
|
|
|
get_typical_interval(data);
|
|
|
|
|
|
+ /*
|
|
|
+ * Performance multiplier defines a minimum predicted idle
|
|
|
+ * duration / latency ratio. Adjust the latency limit if
|
|
|
+ * necessary.
|
|
|
+ */
|
|
|
+ interactivity_req = data->predicted_us / performance_multiplier();
|
|
|
+ if (latency_req > interactivity_req)
|
|
|
+ latency_req = interactivity_req;
|
|
|
+
|
|
|
/*
|
|
|
* We want to default to C1 (hlt), not to busy polling
|
|
|
* unless the timer is happening really really soon.
|
|
@@ -353,8 +360,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
|
|
continue;
|
|
|
if (s->exit_latency > latency_req)
|
|
|
continue;
|
|
|
- if (s->exit_latency * multiplier > data->predicted_us)
|
|
|
- continue;
|
|
|
|
|
|
data->last_state_idx = i;
|
|
|
}
|