Received: by 2002:a17:90b:8d0:0:0:0:0 with SMTP id ds16csp393905pjb; Wed, 22 Jul 2020 02:39:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxolTYC9N4b5YpjoGx0hNcDmVEsM8gRg9i+bjAkdOuMZ19m9enB8+6w6Y1UkE9G4js0sG5u X-Received: by 2002:aa7:d2d2:: with SMTP id k18mr28919686edr.16.1595410755984; Wed, 22 Jul 2020 02:39:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595410755; cv=none; d=google.com; s=arc-20160816; b=ET6RxeAzCLmLOaPviKWtx8rywj1+qWypygVHsduGIL1MBsHGNhvXUwqS4QjEo04hwr CZVyKkJok23R8ClOpLJy3k8qgtz0d9qnyHH3ZqNtxh5xG4ynTcaRtp9Zd8Li/rt4otr4 neQYggByClfAzt4PruLYjyp7hiYxEo5t3Svr5BEo77ouSxzrqZzI8+ODsyuBAipNgltg iOfl/j86B8An9PYKuoVHkK5DZ1pinhQoIo3KgcjFnIqdVOQ5TucPkAiYGVheb3UTIXnr 6UqDmoMIZ454saxxKOs5m4r4hkQWGNqHweyVwVPQ4CF1zGPtjWuPn8rnljPENNB4WCSk roPQ== 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; bh=fyecbuBO0DBIdIb0zuAe2zt9nZNYHLGLqIZONLUBTYg=; b=U84x1SZnpvUJ/hoxt2W++u7s2FlxNC84UnXXdYMfRJaxhOre0/vdigaieHIqVi+gIy 4gQKVFmYrXlEqr68QZI5xuzpweNABh8rJObP1QpGXvJ2a5obHuHqBAYlww+MNSY3n+3N TLRpYJq0CXhy1+A4w3FWEXAlDBeWmTcQOzD96xjxDbZ06OUzqNCPPMR9Ppt9irI+EZBk o7foAO4HLBP+q/gl/n0FxFvCG6AGwCihH3017UD/CCOB+bzCY/7GpE2+ewCzit5abkob Vf7Gi1h7RkJsjwKeyYmNPbFJ55/cz/8rlbM4uM3bM1sFhcYgcEqhdiZFkDzxkYQjY6RC q+ow== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o11si13833236ejx.693.2020.07.22.02.38.53; Wed, 22 Jul 2020 02:39:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731569AbgGVJik (ORCPT + 99 others); Wed, 22 Jul 2020 05:38:40 -0400 Received: from foss.arm.com ([217.140.110.172]:53016 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726147AbgGVJij (ORCPT ); Wed, 22 Jul 2020 05:38:39 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 48B021045; Wed, 22 Jul 2020 02:38:39 -0700 (PDT) Received: from e108754-lin.cambridge.arm.com (unknown [10.1.198.53]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 9D0C23F66F; Wed, 22 Jul 2020 02:38:37 -0700 (PDT) From: Ionela Voinescu To: rjw@rjwysocki.net, viresh.kumar@linaro.org, dietmar.eggemann@arm.com, catalin.marinas@arm.com, sudeep.holla@arm.com, will@kernel.org, linux@armlinux.org.uk Cc: mingo@redhat.com, peterz@infradead.org, linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, ionela.voinescu@arm.com Subject: [PATCH v2 2/7] cpufreq: set invariance scale factor on transition end Date: Wed, 22 Jul 2020 10:37:27 +0100 Message-Id: <20200722093732.14297-3-ionela.voinescu@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200722093732.14297-1-ionela.voinescu@arm.com> References: <20200722093732.14297-1-ionela.voinescu@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org While the move of the invariance setter calls (arch_set_freq_scale()) from cpufreq drivers to cpufreq core maintained the previous functionality for existing drivers that use target_index() and fast_switch() for frequency switching, it also gives the possibility of adding support for users of the target() callback, which is exploited here. To be noted that the target() callback has been flagged as deprecated since: commit 9c0ebcf78fde ("cpufreq: Implement light weight ->target_index() routine") It also doesn't have that many users: cpufreq-nforce2.c:371:2: .target = nforce2_target, cppc_cpufreq.c:416:2: .target = cppc_cpufreq_set_target, gx-suspmod.c:439:2: .target = cpufreq_gx_target, pcc-cpufreq.c:573:2: .target = pcc_cpufreq_target, Similarly to the path taken for target_index() calls in the cpufreq core during a frequency change, all of the drivers above will mark the end of a frequency change by a call to cpufreq_freq_transition_end(). Therefore, cpufreq_freq_transition_end() can be used as the location for the arch_set_freq_scale() call to potentially inform the scheduler of the frequency change. This change maintains the previous functionality for the drivers that implement the target_index() callback, while also adding support for the few drivers that implement the deprecated target() callback. Two notes are worthwhile here: - In __target_index(), cpufreq_freq_transition_end() is called only for drivers that have synchronous notifications enabled. There is only one driver that disables them, drivers/cpufreq/powernow-k8.c:1142: .flags = CPUFREQ_ASYNC_NOTIFICATION, which is deprecated. - Despite marking a successful frequency change, many cpufreq drivers will populate the new policy->cur with the new requested frequency, although this might not be the one granted by the hardware. Therefore, the call to arch_set_freq_scale() is a "best effort" one, and it is up to the architecture if the new frequency is used in the new frequency scale factor setting or eventually used by the scheduler. The architecture is in a better position to decide if it has better methods to obtain more accurate information regarding the current frequency (for example the use of counters). Signed-off-by: Ionela Voinescu Cc: Rafael J. Wysocki Cc: Viresh Kumar --- drivers/cpufreq/cpufreq.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index bac4101546db..3497c1cd6818 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -448,6 +448,10 @@ void cpufreq_freq_transition_end(struct cpufreq_policy *policy, cpufreq_notify_post_transition(policy, freqs, transition_failed); + arch_set_freq_scale(policy->related_cpus, + policy->cur, + policy->cpuinfo.max_freq); + policy->transition_ongoing = false; policy->transition_task = NULL; @@ -2159,7 +2163,7 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, unsigned int relation) { unsigned int old_target_freq = target_freq; - int index, retval; + int index; if (cpufreq_disabled()) return -ENODEV; @@ -2190,14 +2194,7 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, index = cpufreq_frequency_table_target(policy, target_freq, relation); - retval = __target_index(policy, index); - - if (!retval) - arch_set_freq_scale(policy->related_cpus, - policy->freq_table[index].frequency, - policy->cpuinfo.max_freq); - - return retval; + return __target_index(policy, index); } EXPORT_SYMBOL_GPL(__cpufreq_driver_target); -- 2.17.1