cpuidle: menu: Avoid computations for very close timers
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 2 Oct 2018 21:46:28 +0000 (23:46 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 4 Oct 2018 17:27:27 +0000 (19:27 +0200)
If the next timer event (not including the tick) is closer than the
target residency of the second state or the PM QoS latency constraint
is below its exit latency, state[0] will be used regardless of any
other factors, so skip the computations in menu_select() then and
return 0 straight away from it.

Still, do that after the bucket has been determined to avoid
updating the correction factor for a stale bucket.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
drivers/cpuidle/governors/menu.c

index 968379d..667606c 100644 (file)
@@ -309,6 +309,18 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
        get_iowait_load(&nr_iowaiters, &cpu_load);
        data->bucket = which_bucket(data->next_timer_us, nr_iowaiters);
 
+       if (unlikely(drv->state_count <= 1) ||
+           ((data->next_timer_us < drv->states[1].target_residency ||
+             latency_req < drv->states[1].exit_latency) &&
+            !drv->states[0].disabled && !dev->states_usage[0].disable)) {
+               /*
+                * In this case state[0] will be used no matter what, so return
+                * it right away and keep the tick running.
+                */
+               *stop_tick = false;
+               return 0;
+       }
+
        /*
         * Force the result of multiplication to be 64 bits even if both
         * operands are 32 bits.