Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp44754imm; Mon, 21 May 2018 01:53:35 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrwTU56LWKO44RJ7e6KQkgE2TUuhk2+MbyAXbbxa0xlYDjYVjFx+l15PPbB74iWBbokndmK X-Received: by 2002:a65:52cc:: with SMTP id z12-v6mr14913786pgp.126.1526892815788; Mon, 21 May 2018 01:53:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526892815; cv=none; d=google.com; s=arc-20160816; b=M8F1VNone+ufT7Qpg9K9iE18qRzK1qkOAJapTfBzEZCuON1nM1QDcXV7C46KuZ+ocA oDIRElj4vnUWc8I7iFJFtjqYaEwE6X1Dt+om510PnPqfKepzq+9XePU2RC7A8NNxJTa1 RK9tNinGbV500Jbg73tz/iEWY5PYhmuLxf/hiXAm3FLtVC5LpJSwasX16KPlRMOZ96eA oYDUneZHJEFA7mZLngp4Sl2N+6//G9wcv2iSawQBeROv98hB8d/AuaFz5KrpZmzEsqbf blYGY+2+oM27076cgkMRFpsAblbWzT76LiVXJlWg2iYdcar/+iPGeWEZWRIA34Oyn6Af CIxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=0c7eTCHpPS2XccWgFGymVk/nhVVXL7Dv9CWn64hZMaA=; b=lsKvgEoobYGyiKvR7BT3TzcJy0eabEE68d+j8RNaKYqBq05Wga8ApUt09oIKZh2+va VhwCXMMXAexgTM0aPqK9ptxBd5I0EfDa1Y7o5NFVHdmkwSfTGRuVrIRuz+NKf9hH0OuQ 12F2ve7uEfZZaw6I1OuQGTIOU++1UPg85O8Q3qlJA7h4ut4trXhtTMO7HlQlVPjquPcH h6IwDtsWmJzUfzeyJwm2A4E0zWv3XQ0DBlTt3uuyKf+4imEptQcYJC+hrNE5i58UVsrp x0rgB8VTZ+p9Uw/b7wJFA9fFGg5sRMXujNlmL/j7ThkyPmkuTWYR4bGuGHtloHquoACK GJnA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t126-v6si13836821pfd.55.2018.05.21.01.53.21; Mon, 21 May 2018 01:53:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751188AbeEUIws (ORCPT + 99 others); Mon, 21 May 2018 04:52:48 -0400 Received: from foss.arm.com ([217.140.101.70]:45116 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751019AbeEUIvi (ORCPT ); Mon, 21 May 2018 04:51:38 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id AEB871529; Mon, 21 May 2018 01:51:38 -0700 (PDT) Received: from e110439-lin.cambridge.arm.com (e110439-lin.cambridge.arm.com [10.1.210.68]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id C16B73F25D; Mon, 21 May 2018 01:51:36 -0700 (PDT) From: Patrick Bellasi To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Cc: Ingo Molnar , Peter Zijlstra , "Rafael J . Wysocki" , Viresh Kumar , Vincent Guittot , Dietmar Eggemann , Juri Lelli , Joel Fernandes Subject: [PATCH v3 1/2] cpufreq: schedutil: Fix iowait boost reset Date: Mon, 21 May 2018 09:51:19 +0100 Message-Id: <20180521085120.7902-2-patrick.bellasi@arm.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180521085120.7902-1-patrick.bellasi@arm.com> References: <20180521085120.7902-1-patrick.bellasi@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A more energy efficient update of the IO wait boosting mechanism has been introduced in: commit a5a0809bc58e ("cpufreq: schedutil: Make iowait boost more energy efficient") where the boost value is expected to be: - doubled at each successive wakeup from IO staring from the minimum frequency supported by a CPU - reset when a CPU is not updated for more then one tick by either disabling the IO wait boost or resetting its value to the minimum frequency if this new update requires an IO boost. This approach is supposed to "ignore" boosting for sporadic wakeups from IO, while still getting the frequency boosted to the maximum to benefit long sequence of wakeup from IO operations. However, these assumptions are not always satisfied. For example, when an IO boosted CPU enters idle for more the one tick and then wakes up after an IO wait, since in sugov_set_iowait_boost() we first check the IOWAIT flag, we keep doubling the iowait boost instead of restarting from the minimum frequency value. This misbehavior could happen mainly on non-shared frequency domains, thus defeating the energy efficiency optimization, but it can also happen on shared frequency domain systems. Let fix this issue in sugov_set_iowait_boost() by: - first check the IO wait boost reset conditions to eventually reset the boost value - then applying the correct IO boost value if required by the caller Reported-by: Viresh Kumar Signed-off-by: Patrick Bellasi Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Rafael J. Wysocki Cc: Viresh Kumar Cc: Joel Fernandes Cc: Juri Lelli Cc: Dietmar Eggemann Cc: linux-kernel@vger.kernel.org Cc: linux-pm@vger.kernel.org Fixes: a5a0809bc58e ("cpufreq: schedutil: Make iowait boost more energy efficient") --- Changes in v3: - split the fix into a separated patch (this one) - added "Fixes" tag (Viresh) --- kernel/sched/cpufreq_schedutil.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index e13df951aca7..c4063e578e4d 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -203,6 +203,16 @@ static unsigned long sugov_aggregate_util(struct sugov_cpu *sg_cpu) static void sugov_set_iowait_boost(struct sugov_cpu *sg_cpu, u64 time, unsigned int flags) { + /* Clear iowait_boost if the CPU apprears to have been idle. */ + if (sg_cpu->iowait_boost) { + s64 delta_ns = time - sg_cpu->last_update; + + if (delta_ns > TICK_NSEC) { + sg_cpu->iowait_boost = 0; + sg_cpu->iowait_boost_pending = false; + } + } + if (flags & SCHED_CPUFREQ_IOWAIT) { if (sg_cpu->iowait_boost_pending) return; @@ -216,14 +226,6 @@ static void sugov_set_iowait_boost(struct sugov_cpu *sg_cpu, u64 time, unsigned } else { sg_cpu->iowait_boost = sg_cpu->sg_policy->policy->min; } - } else if (sg_cpu->iowait_boost) { - s64 delta_ns = time - sg_cpu->last_update; - - /* Clear iowait_boost if the CPU apprears to have been idle. */ - if (delta_ns > TICK_NSEC) { - sg_cpu->iowait_boost = 0; - sg_cpu->iowait_boost_pending = false; - } } } -- 2.15.1