cpufreq: intel_pstate: Improve IO performance with per-core P-states
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Fri, 4 Aug 2017 02:03:14 +0000 (19:03 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 4 Aug 2017 11:58:57 +0000 (13:58 +0200)
In the current implementation, the response latency between seeing
SCHED_CPUFREQ_IOWAIT set and the actual P-state adjustment can be up
to 10ms.  It can be reduced by bumping up the P-state to the max at
the time SCHED_CPUFREQ_IOWAIT is passed to intel_pstate_update_util().
With this change, the IO performance improves significantly.

For a simple "grep -r . linux" (Here linux is the kernel source
folder) with caches dropped every time on a Broadwell Xeon workstation
with per-core P-states, the user and system time is shorter by as much
as 30% - 40%.

The same performance difference was not observed on clients that don't
support per-core P-state.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
[ rjw: Changelog ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/intel_pstate.c

index 2eac2adff11bcc011bab358412a5ca6067849d08..532e261b2cab7f8a5b9cf0b97640f0d36b67900b 100644 (file)
@@ -1526,6 +1526,15 @@ static void intel_pstate_update_util(struct update_util_data *data, u64 time,
 
        if (flags & SCHED_CPUFREQ_IOWAIT) {
                cpu->iowait_boost = int_tofp(1);
+               cpu->last_update = time;
+               /*
+                * The last time the busy was 100% so P-state was max anyway
+                * so avoid overhead of computation.
+                */
+               if (fp_toint(cpu->sample.busy_scaled) == 100)
+                       return;
+
+               goto set_pstate;
        } else if (cpu->iowait_boost) {
                /* Clear iowait_boost if the CPU may have been idle. */
                delta_ns = time - cpu->last_update;
@@ -1537,6 +1546,7 @@ static void intel_pstate_update_util(struct update_util_data *data, u64 time,
        if ((s64)delta_ns < INTEL_PSTATE_DEFAULT_SAMPLING_INTERVAL)
                return;
 
+set_pstate:
        if (intel_pstate_sample(cpu, time)) {
                int target_pstate;