Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751636AbdGWEBJ (ORCPT ); Sun, 23 Jul 2017 00:01:09 -0400 Received: from mail-oi0-f47.google.com ([209.85.218.47]:35361 "EHLO mail-oi0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751031AbdGWEBH (ORCPT ); Sun, 23 Jul 2017 00:01:07 -0400 MIME-Version: 1.0 In-Reply-To: <5729344.Wykzce7uVP@aspire.rjw.lan> References: <20170722074754.30464-1-joelaf@google.com> <5729344.Wykzce7uVP@aspire.rjw.lan> From: Joel Fernandes Date: Sat, 22 Jul 2017 21:01:06 -0700 Message-ID: Subject: Re: [PATCH v6] cpufreq: schedutil: Make iowait boost more energy efficient To: "Rafael J. Wysocki" Cc: LKML , Juri Lelli , Patrick Bellasi , Andres Oportus , Dietmar Eggemann , Srinivas Pandruvada , Len Brown , Viresh Kumar , Ingo Molnar , Peter Zijlstra Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3823 Lines: 85 On Sat, Jul 22, 2017 at 2:44 PM, Rafael J. Wysocki wrote: > On Saturday, July 22, 2017 12:47:53 AM Joel Fernandes wrote: >> Currently the iowait_boost feature in schedutil makes the frequency go to max >> on iowait wakeups. This feature was added to handle a case that Peter >> described where the throughput of operations involving continuous I/O requests >> [1] is reduced due to running at a lower frequency, however the lower >> throughput itself causes utilization to be low and hence causing frequency to >> be low hence its "stuck". >> >> Instead of going to max, its also possible to achieve the same effect by >> ramping up to max if there are repeated in_iowait wakeups happening. This patch >> is an attempt to do that. We start from a lower frequency (policy->min) >> and double the boost for every consecutive iowait update until we reach the >> maximum iowait boost frequency (iowait_boost_max). >> >> I ran a synthetic test (continuous O_DIRECT writes in a loop) on an x86 machine >> with intel_pstate in passive mode using schedutil. In this test the iowait_boost >> value ramped from 800MHz to 4GHz in 60ms. The patch achieves the desired improved >> throughput as the existing behavior. >> >> Also while at it, make iowait_boost and iowait_boost_max as unsigned int since >> its unit is kHz and this is consistent with struct cpufreq_policy. >> >> [1] https://patchwork.kernel.org/patch/9735885/ >> >> Cc: Srinivas Pandruvada >> Cc: Len Brown >> Cc: Rafael J. Wysocki >> Cc: Viresh Kumar >> Cc: Ingo Molnar >> Cc: Peter Zijlstra >> Suggested-by: Peter Zijlstra >> Suggested-by: Viresh Kumar >> Signed-off-by: Joel Fernandes >> --- >> Viresh, made slight modifications to the last approach we agreed on using, but >> nothing we didn't already discuss. I also dropped the RFC tag since I think >> this is increasingly now becoming final (or has become final if no one else has >> any other objection). >> >> kernel/sched/cpufreq_schedutil.c | 37 +++++++++++++++++++++++++++++++------ >> 1 file changed, 31 insertions(+), 6 deletions(-) >> >> diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c >> index 622eed1b7658..0c0b6c8c15fc 100644 >> --- a/kernel/sched/cpufreq_schedutil.c >> +++ b/kernel/sched/cpufreq_schedutil.c >> @@ -53,6 +53,7 @@ struct sugov_cpu { >> struct update_util_data update_util; >> struct sugov_policy *sg_policy; >> >> + bool iowait_boost_pending; >> unsigned long iowait_boost; >> unsigned long iowait_boost_max; >> u64 last_update; >> @@ -172,30 +173,53 @@ static void sugov_set_iowait_boost(struct sugov_cpu *sg_cpu, u64 time, >> unsigned int flags) >> { >> if (flags & SCHED_CPUFREQ_IOWAIT) { >> - sg_cpu->iowait_boost = sg_cpu->iowait_boost_max; >> + if (sg_cpu->iowait_boost_pending) >> + return; >> + >> + sg_cpu->iowait_boost_pending = true; >> + >> + if (sg_cpu->iowait_boost) { >> + sg_cpu->iowait_boost = min(sg_cpu->iowait_boost << 1, >> + sg_cpu->iowait_boost_max); > > I would do > > sg_cpu->iowait_boost <<= 1; > if (sg_cpu->iowait_boost > sg_cpu->iowait_boost_max) > sg_cpu->iowait_boost = sg_cpu->iowait_boost_max; > > as that's easeir to read. > > The rest of the patch is fine by me. Done, and resent patches. Also added one more to change the iowait_boost and iowait_boost_max to unsigned it. thanks, -Joel