From: Pierre Gondois <pierre.gondois@arm.com>
To: Jie Zhan <zhanjie9@hisilicon.com>,
"zhangpengjie (A)" <zhangpengjie2@huawei.com>,
rafael@kernel.org, viresh.kumar@linaro.org
Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
zhenglifeng1@huawei.com, lihuisong@huawei.com,
yubowen8@huawei.com, linhongye@h-partners.com,
linuxarm@huawei.com, jonathan.cameron@huawei.com,
wangzhi12@huawei.com
Subject: Re: [PATCH v2] cpufreq: cppc: Clamp default minimum limit to lowest_nonlinear_perf
Date: Tue, 10 Mar 2026 12:07:23 +0100 [thread overview]
Message-ID: <41a342b8-0b57-4b0e-bf25-a460ac77d3ed@arm.com> (raw)
In-Reply-To: <ab94db5d-fbe0-4095-9a28-24055edcfdfa@hisilicon.com>
On 3/10/26 10:12, Jie Zhan wrote:
>
> On 3/9/2026 9:16 PM, zhangpengjie (A) wrote:
>> Hi Jie,
>>
>> On 3/5/2026 9:49 PM, Jie Zhan wrote:
>>> On 2/13/2026 6:06 PM, Pengjie Zhang wrote:
>>>> The ACPI spec defines 'lowest_nonlinear_perf' as the threshold for
>>>> linear performance scaling. Performance levels below this threshold
>>>> are typically inefficient and should not be used by default.
>>>>
>>>> Currently, the QoS minimum request is initialized to 0. This defaults
>>> I'm more curious on the original commit that overrides the policy->min set
>>> by driver, which is:
>>> 521223d8b3ec ("cpufreq: Fix initialization of min and max frequency QoS requests")
>>>
>>> The changelog says:
>>> "The min and max frequency QoS requests in the cpufreq core are initialized
>>> to whatever the current min and max frequency values are at the init time,
>>> but if any of these values change later (for example, cpuinfo.max_freq is
>>> updated by the driver), these initial request values will be limiting the
>>> CPU frequency unnecessarily unless they are changed by user space via
>>> sysfs."
>>>
>>> So, instead of doing what the patch did, what about calling
>>> freq_qos_update_request(policy->max_freq_req, xxx) when cpuinfo.max_freq is
>>> updated?
>>>
>>> Jie
>> Thanks for pointing this out.
>>
>> I think commit 521223d8b3ec intentionally changed the semantics of the
>> core min/max QoS requests so that they no longer reflect the initial
>> policy limits set by the driver. Instead, they stay at the default
>> "no constraint" values until user space (or another QoS client) updates
>> them. That makes sense for the problem described in that changelog.
>>
>> What my patch is trying to address is a slightly different issue in
>> cppc_cpufreq: the driver currently treats `lowest_nonlinear_perf` as
>> the default minimum policy floor, but with the current core semantics
>> that floor is not represented explicitly and gets lost during policy
>> initialization.
> Yeah, the current status:
> Setting 'policy->min' in driver->init() is pointless at the moment, while
> some drivers are still doing it. The effective place to set 'policy->min'
> became driver->verify(), but a minor side effect by doing so is
> 'policy->min' can't be preserved on switching governors.
>> So I agree that calling freq_qos_update_request() when
>> cpuinfo.min_freq/max_freq changes is the right approach for stale
>> request updates, but I am not sure it addresses the question
>> for `lowest_nonlinear_perf` itself:
> I was talking about calling freq_qos_update_request() in commit
> 521223d8b3ec.
>> Should it be modeled as a hard driver constraint, or only as the
>> default minimum policy value that user space may still lower explicitly?
>>
>> My patch assumes the latter, although I agree the current implementation
>> is not the cleanest way to express it.
>>
>> Thanks,
>> Pengjie
>>
>>
> Does [1] also solve this issue by chance? especially Patch 5.
> If so, I think we may follow that up and get the framework to a sensible
> shape.
> [1] https://lore.kernel.org/linux-pm/20260225084930.1692228-1-pierre.gondois@arm.com/
Yes right, this should help:
+ /* + * If the driver has set policy->min or max, + * use the value as
a QoS request. + */ + min = max(FREQ_QOS_MIN_DEFAULT_VALUE,
policy->min); + if (policy->max) + max = min(FREQ_QOS_MAX_DEFAULT_VALUE,
policy->max); + else + max = FREQ_QOS_MAX_DEFAULT_VALUE;
However in the patchset, policy->min is not set to the lowest non linear
freq.,
so this would have to be done aswell.
------
It also seem preferable to set the min QOS value once at init rather that
re-computing it on each ->verify() call.
>>>> the performance floor to the absolute "Lowest Performance" state
>>>> instead of "lowest_nonlinear_perf", allowing the CPU to operate in
>>>> an inefficient range unnecessarily.
>>>>
>>>> Signed-off-by: Pengjie Zhang <zhangpengjie2@huawei.com>
>>>> ---
>>>> Changes in v2:
>>>> - Renamed the patch subject to better reflect the logic change.
>>>> - Updated the commit log to clarify ACPI spec details.
>>>> Link to v1:https://lore.kernel.org/all/20260116094555.2978887-1-zhangpengjie2@huawei.com/
>>>> ---
>>>> drivers/cpufreq/cppc_cpufreq.c | 18 ++++++++++++++++--
>>>> 1 file changed, 16 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
>>>> index 7e8042efedd1..4a3031d9fcf4 100644
>>>> --- a/drivers/cpufreq/cppc_cpufreq.c
>>>> +++ b/drivers/cpufreq/cppc_cpufreq.c
>>>> @@ -333,9 +333,23 @@ static unsigned int cppc_cpufreq_fast_switch(struct cpufreq_policy *policy,
>>>> return target_freq;
>>>> }
>>>> -static int cppc_verify_policy(struct cpufreq_policy_data *policy)
>>>> +static int cppc_verify_policy(struct cpufreq_policy_data *policy_data)
>>>> {
>>>> - cpufreq_verify_within_cpu_limits(policy);
>>>> + if (policy_data->min == FREQ_QOS_MIN_DEFAULT_VALUE) {
>>>> + struct cpufreq_policy *policy __free(put_cpufreq_policy) =
>>>> + cpufreq_cpu_get(policy_data->cpu);
>>>> + struct cppc_cpudata *cpu_data;
>>>> +
>>>> + if (!policy)
>>>> + return -EINVAL;
>>>> +
>>>> + cpu_data = policy->driver_data;
>>>> + policy_data->min = cppc_perf_to_khz(&cpu_data->perf_caps,
>>>> + cpu_data->perf_caps.lowest_nonlinear_perf);
>>>> + }
>>>> +
>>>> + cpufreq_verify_within_cpu_limits(policy_data);
>>>> +
>>>> return 0;
>>>> }
>>>>
prev parent reply other threads:[~2026-03-10 11:08 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-13 10:06 Pengjie Zhang
2026-03-03 12:03 ` zhangpengjie (A)
2026-03-05 6:32 ` Viresh Kumar
2026-03-05 7:00 ` Jie Zhan
2026-03-05 11:31 ` zhenglifeng (A)
2026-03-05 13:14 ` Sumit Gupta
2026-03-06 15:08 ` Pierre Gondois
2026-03-06 18:16 ` Rafael J. Wysocki
2026-03-05 11:34 ` zhenglifeng (A)
2026-03-05 13:49 ` Jie Zhan
2026-03-09 13:16 ` zhangpengjie (A)
2026-03-10 9:12 ` Jie Zhan
2026-03-10 11:07 ` Pierre Gondois [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=41a342b8-0b57-4b0e-bf25-a460ac77d3ed@arm.com \
--to=pierre.gondois@arm.com \
--cc=jonathan.cameron@huawei.com \
--cc=lihuisong@huawei.com \
--cc=linhongye@h-partners.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=rafael@kernel.org \
--cc=viresh.kumar@linaro.org \
--cc=wangzhi12@huawei.com \
--cc=yubowen8@huawei.com \
--cc=zhangpengjie2@huawei.com \
--cc=zhanjie9@hisilicon.com \
--cc=zhenglifeng1@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®