From patchwork Wed Aug 7 07:06:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 170725 Delivered-To: patch@linaro.org Received: by 2002:a92:512:0:0:0:0:0 with SMTP id q18csp6742181ile; Wed, 7 Aug 2019 00:06:12 -0700 (PDT) X-Google-Smtp-Source: APXvYqxIJKLA5Zs96CJO43ojC8jdoUOI7ajj0RpS18y8HGZK3+XPEAlyydcNtn4zP36I7hAno7gs X-Received: by 2002:a62:e403:: with SMTP id r3mr7523385pfh.37.1565161572284; Wed, 07 Aug 2019 00:06:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565161572; cv=none; d=google.com; s=arc-20160816; b=kZGBx6AquEDPJfFLwFDcx6Sv8tmldCwtdGgk3mnIIizGPCbg2LY+2XRfht1wdH1h3l KAT/lhM3BwI1bxzGPG3yzQoJdYktSpNfypG4eeSG0OcTI1F6nv43K/9mlID/W9hXXdPB HT7pwqBVIdBlW0k5bts/+YOb6AyD5l6KSHYvq8btBEn+JfYovgVEg3IjKmXTJJlyMwXx aVgSgkefR9gIbB1hDvWbxnP+Fy6dKoKyQTkV+zQAZqDE26vxUyCJ5sSUaml1mPz/J6XL t7XJEfYeFkDEXZqfOPe4mFpdMxU3Hphu4/DVNTA47d+w4voKg4QxlJrqsikxL2btyWAV WcZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=qZIcf8cwa9igDXcslC8hIzH7Ja/YvdjdJITOrrBaFhM=; b=W47IBWyTgeHIUR12+yHg5y5bUUEFHGGhvXuTwl9a3V+xRM5luIEr8yE21HlYy1/PGB RxC+QL+r6T8GRbMjt1vCd52111ZV+Pgc+cQdlCaNPrvUlaTNF5ANkilcV6seye/K4hoZ uWJcBywH/1UenfAEngl5u41aYA2epfpUtBjru0o7ZnqyBdz+hdt5rtMtW6LtVhw6wjVN t4LgGj6rl0GJof3si8jZPrx9yGqB9T6Tdcwm8kAZfg5UzJ4y4a2Dw3rb8Wf809UpWSno SvSz0Y+wNJtSafZFhh7bGANGFGxEkVbvnEUocR1r8YeQXY3FEHRYwJGjZYIljMIx3gz4 BatQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=uGWRV7RE; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y71si45833631pgd.271.2019.08.07.00.06.11; Wed, 07 Aug 2019 00:06:12 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=uGWRV7RE; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727673AbfHGHGK (ORCPT + 11 others); Wed, 7 Aug 2019 03:06:10 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:44498 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727281AbfHGHGK (ORCPT ); Wed, 7 Aug 2019 03:06:10 -0400 Received: by mail-pl1-f194.google.com with SMTP id t14so39286040plr.11 for ; Wed, 07 Aug 2019 00:06:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=qZIcf8cwa9igDXcslC8hIzH7Ja/YvdjdJITOrrBaFhM=; b=uGWRV7REDU+/UifJJKwmcUdbbfC4+kwOlu/L+nhcItsXbS9UPMcFi7KVOdRDWbGf1q dRx1FjrW5TtVAPn5B7HMX1/W5eDB7o/iEVGTwe3yxgl4WRZVORhNkGMWxpZfqnlErHMb hji3OIQC0rxu9lxBbQnzsjqSwv2EsvVrEBLBxSYg5/cf0pLOrl96k/FannaVJcaklLjc HYf5DtgdzxJZbnA/z8yBce20TryrnPvNlAVrvFTRkGMkHRv2RAeqbSZ6gcq6/18qUt1Z 316qtvwaOJAwd/k0dSY0XSCLu4CtLuKCCUIb59IcZgwHPgdnF09QRh7sOw8W6tEheyEA pBeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=qZIcf8cwa9igDXcslC8hIzH7Ja/YvdjdJITOrrBaFhM=; b=siBLwBEQTnKv8ShBwRSIUW9kT2ekWJdBv3Hd7cdL0aXLJj990xfZaPn5A7oSO8h7LD FqQ7rh5lgMYmOmQUiUYKG0+abUBruCFfHHqQFS/QUU2aDJkVNY3IZuHqxB8LPDIrqGw5 6a0hLZMZzAlb1xaq6misUZKF1OHI0wZlt40SAmL/3MfaTAMhaggvgN6ZchVOSuzG/VO8 tYkQ09za7hHCShBJFlWcpZWFsiaONwknY2DYh7QFgeHBIHPgC4hVcgl+KyDEuB0Yi/iu rGA4Zt7kpKFT2FvFNyac7vw5lpGBBNBx4HCQjV+3xBbkCWpuGbb4MLW5mjXh4FnZCa74 C/mA== X-Gm-Message-State: APjAAAVSxb5GGCThIWIJyab8tEaln8z5xD2r2g4FD/RoUsOmXug1YJpx 0fRkL5vDDU3WFDL7J2id/bc3Vw== X-Received: by 2002:a62:3347:: with SMTP id z68mr8065751pfz.174.1565161569245; Wed, 07 Aug 2019 00:06:09 -0700 (PDT) Received: from localhost ([122.172.76.219]) by smtp.gmail.com with ESMTPSA id c98sm25633299pje.1.2019.08.07.00.06.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 07 Aug 2019 00:06:08 -0700 (PDT) From: Viresh Kumar To: Rafael Wysocki , Viresh Kumar , Ingo Molnar , Peter Zijlstra Cc: linux-pm@vger.kernel.org, Vincent Guittot , "v4 . 18+" , Doug Smythies , linux-kernel@vger.kernel.org Subject: [PATCH V4 1/2] cpufreq: schedutil: Don't skip freq update when limits change Date: Wed, 7 Aug 2019 12:36:01 +0530 Message-Id: <70fce19e43bb825c3b2546e1211d262a59ae7378.1565161495.git.viresh.kumar@linaro.org> X-Mailer: git-send-email 2.21.0.rc0.269.g1a574e7a288b MIME-Version: 1.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org To avoid reducing the frequency of a CPU prematurely, we skip reducing the frequency if the CPU had been busy recently. This should not be done when the limits of the policy are changed, for example due to thermal throttling. We should always get the frequency within the new limits as soon as possible. Trying to fix this by using only one flag, i.e. need_freq_update, can lead to a race condition where the flag gets cleared without forcing us to change the frequency at least once. And so this patch introduces another flag to avoid that race condition. Fixes: ecd288429126 ("cpufreq: schedutil: Don't set next_freq to UINT_MAX") Cc: v4.18+ # v4.18+ Reported-by: Doug Smythies Tested-by: Doug Smythies Signed-off-by: Viresh Kumar --- V3->V4: - Rewrite "if" block to avoid setting variable to false at initialization. - Added Tested-by from Doug. kernel/sched/cpufreq_schedutil.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) -- 2.21.0.rc0.269.g1a574e7a288b diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 636ca6f88c8e..867b4bb6d4be 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -40,6 +40,7 @@ struct sugov_policy { struct task_struct *thread; bool work_in_progress; + bool limits_changed; bool need_freq_update; }; @@ -89,8 +90,11 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time) !cpufreq_this_cpu_can_update(sg_policy->policy)) return false; - if (unlikely(sg_policy->need_freq_update)) + if (unlikely(sg_policy->limits_changed)) { + sg_policy->limits_changed = false; + sg_policy->need_freq_update = true; return true; + } delta_ns = time - sg_policy->last_freq_update_time; @@ -437,7 +441,7 @@ static inline bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { return false; } static inline void ignore_dl_rate_limit(struct sugov_cpu *sg_cpu, struct sugov_policy *sg_policy) { if (cpu_bw_dl(cpu_rq(sg_cpu->cpu)) > sg_cpu->bw_dl) - sg_policy->need_freq_update = true; + sg_policy->limits_changed = true; } static void sugov_update_single(struct update_util_data *hook, u64 time, @@ -457,7 +461,8 @@ static void sugov_update_single(struct update_util_data *hook, u64 time, if (!sugov_should_update_freq(sg_policy, time)) return; - busy = sugov_cpu_is_busy(sg_cpu); + /* Limits may have changed, don't skip frequency update */ + busy = !sg_policy->need_freq_update && sugov_cpu_is_busy(sg_cpu); util = sugov_get_util(sg_cpu); max = sg_cpu->max; @@ -831,6 +836,7 @@ static int sugov_start(struct cpufreq_policy *policy) sg_policy->last_freq_update_time = 0; sg_policy->next_freq = 0; sg_policy->work_in_progress = false; + sg_policy->limits_changed = false; sg_policy->need_freq_update = false; sg_policy->cached_raw_freq = 0; @@ -879,7 +885,7 @@ static void sugov_limits(struct cpufreq_policy *policy) mutex_unlock(&sg_policy->work_lock); } - sg_policy->need_freq_update = true; + sg_policy->limits_changed = true; } struct cpufreq_governor schedutil_gov = {