Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753509AbdGVVwS (ORCPT ); Sat, 22 Jul 2017 17:52:18 -0400 Received: from cloudserver094114.home.net.pl ([79.96.170.134]:63255 "EHLO cloudserver094114.home.net.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750921AbdGVVwQ (ORCPT ); Sat, 22 Jul 2017 17:52:16 -0400 From: "Rafael J. Wysocki" To: Joel Fernandes Cc: linux-kernel@vger.kernel.org, Juri Lelli , Patrick Bellasi , Andres Oportus , Dietmar Eggemann , Srinivas Pandruvada , Len Brown , Viresh Kumar , Ingo Molnar , Peter Zijlstra Subject: Re: [PATCH v6] cpufreq: schedutil: Make iowait boost more energy efficient Date: Sat, 22 Jul 2017 23:44:20 +0200 Message-ID: <5729344.Wykzce7uVP@aspire.rjw.lan> User-Agent: KMail/4.14.10 (Linux/4.12.0-rc1+; KDE/4.14.9; x86_64; ; ) In-Reply-To: <20170722074754.30464-1-joelaf@google.com> References: <20170722074754.30464-1-joelaf@google.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3317 Lines: 80 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. Thanks, Rafael