* [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online
@ 2025-01-15 10:01 Lifeng Zheng
2025-01-15 10:01 ` [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu Lifeng Zheng
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Lifeng Zheng @ 2025-01-15 10:01 UTC (permalink / raw)
To: rafael, viresh.kumar
Cc: linux-pm, linux-kernel, linuxarm, jonathan.cameron, zhanjie9,
lihuisong, zhenglifeng1, fanghao11
Since commit f37a4d6b4a2c ("cpufreq: Fix per-policy boost behavior on
SoCs using cpufreq_boost_set_sw()") and commit 102fa9c4b439 ("cpufreq:
Allow drivers to advertise boost enabled"), per-policy boost flag has
already been set to mirror the cpufreq_driver boost during
initialization. However, the current implementation doesn't work for all
cpufreq drivers and may fail in certain situation. A more generic
implementation is needed.
Lifeng Zheng (2):
cpufreq: Fix re-boost issue after hotplugging a cpu
cpufreq: Introduce a more generic way to set default per-policy boost
flag
drivers/cpufreq/cpufreq.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
--
2.33.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu
2025-01-15 10:01 [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online Lifeng Zheng
@ 2025-01-15 10:01 ` Lifeng Zheng
2025-01-15 11:18 ` Viresh Kumar
2025-01-15 10:01 ` [PATCH 2/2] cpufreq: Introduce a more generic way to set default per-policy boost flag Lifeng Zheng
2025-01-15 12:53 ` [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online Rafael J. Wysocki
2 siblings, 1 reply; 10+ messages in thread
From: Lifeng Zheng @ 2025-01-15 10:01 UTC (permalink / raw)
To: rafael, viresh.kumar
Cc: linux-pm, linux-kernel, linuxarm, jonathan.cameron, zhanjie9,
lihuisong, zhenglifeng1, fanghao11
It turns out that cpuX will stay on the base frequency after performing
these operations:
1. boost all cpus: echo 1 > /sys/devices/system/cpu/cpufreq/boost
2. offline the cpu: echo 0 > /sys/devices/system/cpu/cpuX/online
3. deboost all cpus: echo 0 > /sys/devices/system/cpu/cpufreq/boost
4. online the cpu: echo 1 > /sys/devices/system/cpu/cpuX/online
5. boost all cpus again: echo 1 > /sys/devices/system/cpu/cpufreq/boost
This is because max_freq_req of the policy is not updated during the
online process, and the value of max_freq_req before the last offline is
retained. When the CPU is boosted again, freq_qos_update_request() will
do nothing because the old value is the same as the new one. This causes
the CPU stay on the base frequency. Update max_freq_req (and
min_freq_req of course) in cpufreq_online() will solve this problem.
Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
---
drivers/cpufreq/cpufreq.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 1a4cae54a01b..03ae879d50b9 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1475,6 +1475,13 @@ static int cpufreq_online(unsigned int cpu)
blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
CPUFREQ_CREATE_POLICY, policy);
+ } else {
+ ret = freq_qos_update_request(policy->min_freq_req, policy->min);
+ if (ret < 0)
+ goto out_destroy_policy;
+ ret = freq_qos_update_request(policy->max_freq_req, policy->max);
+ if (ret < 0)
+ goto out_destroy_policy;
}
if (cpufreq_driver->get && has_target()) {
--
2.33.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/2] cpufreq: Introduce a more generic way to set default per-policy boost flag
2025-01-15 10:01 [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online Lifeng Zheng
2025-01-15 10:01 ` [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu Lifeng Zheng
@ 2025-01-15 10:01 ` Lifeng Zheng
2025-01-16 6:54 ` Viresh Kumar
2025-01-15 12:53 ` [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online Rafael J. Wysocki
2 siblings, 1 reply; 10+ messages in thread
From: Lifeng Zheng @ 2025-01-15 10:01 UTC (permalink / raw)
To: rafael, viresh.kumar
Cc: linux-pm, linux-kernel, linuxarm, jonathan.cameron, zhanjie9,
lihuisong, zhenglifeng1, fanghao11
In cpufreq_online() of cpufreq.c, the per-policy boost flag is already set
to mirror the cpufreq_driver boost during init but using freq_table to
judge if the policy has boost frequency. There are two drawbacks to this
approach:
1. It doesn't work for the cpufreq drivers that do not use a frequency
table. For now, acpi-cpufreq and amd-pstate have to enable boost in policy
initialization. And cppc_cpufreq never set policy to boost when going
online no matter what the cpufreq_driver boost flag is.
2. If the cpu goes offline when cpufreq_driver boost enabled and then goes
online when cpufreq_driver boost disabled, the per-policy boost flag will
unreasonably remain true.
Running set_boost at the end of the online process is a more generic way
for all cpufreq drivers.
Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
---
drivers/cpufreq/cpufreq.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 03ae879d50b9..867bda3decfd 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1409,10 +1409,6 @@ static int cpufreq_online(unsigned int cpu)
goto out_free_policy;
}
- /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
- if (cpufreq_boost_enabled() && policy_has_boost_freq(policy))
- policy->boost_enabled = true;
-
/*
* The initialization has succeeded and the policy is online.
* If there is a problem with its frequency table, take it
@@ -1576,6 +1572,18 @@ static int cpufreq_online(unsigned int cpu)
if (new_policy && cpufreq_thermal_control_enabled(cpufreq_driver))
policy->cdev = of_cpufreq_cooling_register(policy);
+ /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
+ if (cpufreq_boost_supported()) {
+ policy->boost_enabled = cpufreq_boost_enabled();
+ ret = cpufreq_driver->set_boost(policy, policy->boost_enabled);
+ if (ret) {
+ /* If the set_boost fails, the online operation is not affected */
+ pr_info("%s: CPU%d: Cannot %s BOOST\n", __func__, policy->cpu,
+ policy->boost_enabled ? "enable" : "disable");
+ policy->boost_enabled = !policy->boost_enabled;
+ }
+ }
+
pr_debug("initialization complete\n");
return 0;
--
2.33.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu
2025-01-15 10:01 ` [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu Lifeng Zheng
@ 2025-01-15 11:18 ` Viresh Kumar
2025-01-15 12:50 ` Rafael J. Wysocki
0 siblings, 1 reply; 10+ messages in thread
From: Viresh Kumar @ 2025-01-15 11:18 UTC (permalink / raw)
To: Lifeng Zheng
Cc: rafael, linux-pm, linux-kernel, linuxarm, jonathan.cameron,
zhanjie9, lihuisong, fanghao11
On 15-01-25, 18:01, Lifeng Zheng wrote:
> It turns out that cpuX will stay on the base frequency after performing
> these operations:
>
> 1. boost all cpus: echo 1 > /sys/devices/system/cpu/cpufreq/boost
>
> 2. offline the cpu: echo 0 > /sys/devices/system/cpu/cpuX/online
>
> 3. deboost all cpus: echo 0 > /sys/devices/system/cpu/cpufreq/boost
>
> 4. online the cpu: echo 1 > /sys/devices/system/cpu/cpuX/online
>
> 5. boost all cpus again: echo 1 > /sys/devices/system/cpu/cpufreq/boost
>
> This is because max_freq_req of the policy is not updated during the
> online process, and the value of max_freq_req before the last offline is
> retained. When the CPU is boosted again, freq_qos_update_request() will
> do nothing because the old value is the same as the new one. This causes
> the CPU stay on the base frequency. Update max_freq_req (and
> min_freq_req of course) in cpufreq_online() will solve this problem.
>
> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
> ---
> drivers/cpufreq/cpufreq.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 1a4cae54a01b..03ae879d50b9 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -1475,6 +1475,13 @@ static int cpufreq_online(unsigned int cpu)
>
> blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
> CPUFREQ_CREATE_POLICY, policy);
> + } else {
> + ret = freq_qos_update_request(policy->min_freq_req, policy->min);
This may not be required, as min-freq-req is never updated.
> + if (ret < 0)
> + goto out_destroy_policy;
> + ret = freq_qos_update_request(policy->max_freq_req, policy->max);
> + if (ret < 0)
> + goto out_destroy_policy;
> }
>
> if (cpufreq_driver->get && has_target()) {
> --
> 2.33.0
--
viresh
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu
2025-01-15 11:18 ` Viresh Kumar
@ 2025-01-15 12:50 ` Rafael J. Wysocki
2025-01-16 1:51 ` zhenglifeng (A)
0 siblings, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2025-01-15 12:50 UTC (permalink / raw)
To: Viresh Kumar
Cc: Lifeng Zheng, rafael, linux-pm, linux-kernel, linuxarm,
jonathan.cameron, zhanjie9, lihuisong, fanghao11
On Wed, Jan 15, 2025 at 12:18 PM Viresh Kumar <viresh.kumar@linaro.org> wrote:
>
> On 15-01-25, 18:01, Lifeng Zheng wrote:
> > It turns out that cpuX will stay on the base frequency after performing
> > these operations:
> >
> > 1. boost all cpus: echo 1 > /sys/devices/system/cpu/cpufreq/boost
> >
> > 2. offline the cpu: echo 0 > /sys/devices/system/cpu/cpuX/online
> >
> > 3. deboost all cpus: echo 0 > /sys/devices/system/cpu/cpufreq/boost
> >
> > 4. online the cpu: echo 1 > /sys/devices/system/cpu/cpuX/online
> >
> > 5. boost all cpus again: echo 1 > /sys/devices/system/cpu/cpufreq/boost
> >
> > This is because max_freq_req of the policy is not updated during the
> > online process, and the value of max_freq_req before the last offline is
> > retained. When the CPU is boosted again, freq_qos_update_request() will
> > do nothing because the old value is the same as the new one. This causes
> > the CPU stay on the base frequency. Update max_freq_req (and
> > min_freq_req of course) in cpufreq_online() will solve this problem.
> >
> > Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
> > ---
> > drivers/cpufreq/cpufreq.c | 7 +++++++
> > 1 file changed, 7 insertions(+)
> >
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 1a4cae54a01b..03ae879d50b9 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -1475,6 +1475,13 @@ static int cpufreq_online(unsigned int cpu)
> >
> > blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
> > CPUFREQ_CREATE_POLICY, policy);
> > + } else {
> > + ret = freq_qos_update_request(policy->min_freq_req, policy->min);
>
> This may not be required, as min-freq-req is never updated.
It gets updated via scaling_min_freq AFAICS. Doesn't this matter?
> > + if (ret < 0)
> > + goto out_destroy_policy;
> > + ret = freq_qos_update_request(policy->max_freq_req, policy->max);
> > + if (ret < 0)
> > + goto out_destroy_policy;
> > }
> >
> > if (cpufreq_driver->get && has_target()) {
> > --
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online
2025-01-15 10:01 [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online Lifeng Zheng
2025-01-15 10:01 ` [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu Lifeng Zheng
2025-01-15 10:01 ` [PATCH 2/2] cpufreq: Introduce a more generic way to set default per-policy boost flag Lifeng Zheng
@ 2025-01-15 12:53 ` Rafael J. Wysocki
2025-01-16 2:08 ` zhenglifeng (A)
2 siblings, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2025-01-15 12:53 UTC (permalink / raw)
To: Lifeng Zheng
Cc: rafael, viresh.kumar, linux-pm, linux-kernel, linuxarm,
jonathan.cameron, zhanjie9, lihuisong, fanghao11
On Wed, Jan 15, 2025 at 11:01 AM Lifeng Zheng <zhenglifeng1@huawei.com> wrote:
>
> Since commit f37a4d6b4a2c ("cpufreq: Fix per-policy boost behavior on
> SoCs using cpufreq_boost_set_sw()") and commit 102fa9c4b439 ("cpufreq:
> Allow drivers to advertise boost enabled"), per-policy boost flag has
> already been set to mirror the cpufreq_driver boost during
> initialization. However, the current implementation doesn't work for all
> cpufreq drivers and may fail in certain situation. A more generic
> implementation is needed.
Can you please be more specific here?
What happens, why it happens and why do you think the way to go is to
reimplement this?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu
2025-01-15 12:50 ` Rafael J. Wysocki
@ 2025-01-16 1:51 ` zhenglifeng (A)
0 siblings, 0 replies; 10+ messages in thread
From: zhenglifeng (A) @ 2025-01-16 1:51 UTC (permalink / raw)
To: Rafael J. Wysocki, Viresh Kumar
Cc: linux-pm, linux-kernel, linuxarm, jonathan.cameron, zhanjie9,
lihuisong, fanghao11
On 2025/1/15 20:50, Rafael J. Wysocki wrote:
> On Wed, Jan 15, 2025 at 12:18 PM Viresh Kumar <viresh.kumar@linaro.org> wrote:
>>
>> On 15-01-25, 18:01, Lifeng Zheng wrote:
>>> It turns out that cpuX will stay on the base frequency after performing
>>> these operations:
>>>
>>> 1. boost all cpus: echo 1 > /sys/devices/system/cpu/cpufreq/boost
>>>
>>> 2. offline the cpu: echo 0 > /sys/devices/system/cpu/cpuX/online
>>>
>>> 3. deboost all cpus: echo 0 > /sys/devices/system/cpu/cpufreq/boost
>>>
>>> 4. online the cpu: echo 1 > /sys/devices/system/cpu/cpuX/online
>>>
>>> 5. boost all cpus again: echo 1 > /sys/devices/system/cpu/cpufreq/boost
>>>
>>> This is because max_freq_req of the policy is not updated during the
>>> online process, and the value of max_freq_req before the last offline is
>>> retained. When the CPU is boosted again, freq_qos_update_request() will
>>> do nothing because the old value is the same as the new one. This causes
>>> the CPU stay on the base frequency. Update max_freq_req (and
>>> min_freq_req of course) in cpufreq_online() will solve this problem.
>>>
>>> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
>>> ---
>>> drivers/cpufreq/cpufreq.c | 7 +++++++
>>> 1 file changed, 7 insertions(+)
>>>
>>> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
>>> index 1a4cae54a01b..03ae879d50b9 100644
>>> --- a/drivers/cpufreq/cpufreq.c
>>> +++ b/drivers/cpufreq/cpufreq.c
>>> @@ -1475,6 +1475,13 @@ static int cpufreq_online(unsigned int cpu)
>>>
>>> blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
>>> CPUFREQ_CREATE_POLICY, policy);
>>> + } else {
>>> + ret = freq_qos_update_request(policy->min_freq_req, policy->min);
>>
>> This may not be required, as min-freq-req is never updated.
>
> It gets updated via scaling_min_freq AFAICS. Doesn't this matter?
If fact, scaling_min_freq cannot be operated when a cpu is offline. So this
update may indeed be unnecessary.
>
>>> + if (ret < 0)
>>> + goto out_destroy_policy;
>>> + ret = freq_qos_update_request(policy->max_freq_req, policy->max);
>>> + if (ret < 0)
>>> + goto out_destroy_policy;
>>> }
>>>
>>> if (cpufreq_driver->get && has_target()) {
>>> --
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online
2025-01-15 12:53 ` [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online Rafael J. Wysocki
@ 2025-01-16 2:08 ` zhenglifeng (A)
0 siblings, 0 replies; 10+ messages in thread
From: zhenglifeng (A) @ 2025-01-16 2:08 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: viresh.kumar, linux-pm, linux-kernel, linuxarm, jonathan.cameron,
zhanjie9, lihuisong, fanghao11
On 2025/1/15 20:53, Rafael J. Wysocki wrote:
> On Wed, Jan 15, 2025 at 11:01 AM Lifeng Zheng <zhenglifeng1@huawei.com> wrote:
>>
>> Since commit f37a4d6b4a2c ("cpufreq: Fix per-policy boost behavior on
>> SoCs using cpufreq_boost_set_sw()") and commit 102fa9c4b439 ("cpufreq:
>> Allow drivers to advertise boost enabled"), per-policy boost flag has
>> already been set to mirror the cpufreq_driver boost during
>> initialization. However, the current implementation doesn't work for all
>> cpufreq drivers and may fail in certain situation. A more generic
>> implementation is needed.
>
> Can you please be more specific here?
>
> What happens, why it happens and why do you think the way to go is to
> reimplement this?
I've explained this in commit log of patch 2. But if you think it is better
to palce here too, I'll do that in v2.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] cpufreq: Introduce a more generic way to set default per-policy boost flag
2025-01-15 10:01 ` [PATCH 2/2] cpufreq: Introduce a more generic way to set default per-policy boost flag Lifeng Zheng
@ 2025-01-16 6:54 ` Viresh Kumar
2025-01-16 8:30 ` zhenglifeng (A)
0 siblings, 1 reply; 10+ messages in thread
From: Viresh Kumar @ 2025-01-16 6:54 UTC (permalink / raw)
To: Lifeng Zheng
Cc: rafael, linux-pm, linux-kernel, linuxarm, jonathan.cameron,
zhanjie9, lihuisong, fanghao11
On 15-01-25, 18:01, Lifeng Zheng wrote:
> In cpufreq_online() of cpufreq.c, the per-policy boost flag is already set
> to mirror the cpufreq_driver boost during init but using freq_table to
> judge if the policy has boost frequency. There are two drawbacks to this
> approach:
>
> 1. It doesn't work for the cpufreq drivers that do not use a frequency
> table. For now, acpi-cpufreq and amd-pstate have to enable boost in policy
> initialization. And cppc_cpufreq never set policy to boost when going
> online no matter what the cpufreq_driver boost flag is.
>
> 2. If the cpu goes offline when cpufreq_driver boost enabled and then goes
> online when cpufreq_driver boost disabled, the per-policy boost flag will
> unreasonably remain true.
Yeah, this is a problem. I agree. If the global boost is disabled,
then boost shouldn't be allowed for any of the policies.
> Running set_boost at the end of the online process is a more generic way
> for all cpufreq drivers.
>
> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
> ---
> drivers/cpufreq/cpufreq.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 03ae879d50b9..867bda3decfd 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -1409,10 +1409,6 @@ static int cpufreq_online(unsigned int cpu)
> goto out_free_policy;
> }
>
> - /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
> - if (cpufreq_boost_enabled() && policy_has_boost_freq(policy))
> - policy->boost_enabled = true;
> -
> /*
> * The initialization has succeeded and the policy is online.
> * If there is a problem with its frequency table, take it
> @@ -1576,6 +1572,18 @@ static int cpufreq_online(unsigned int cpu)
> if (new_policy && cpufreq_thermal_control_enabled(cpufreq_driver))
> policy->cdev = of_cpufreq_cooling_register(policy);
>
> + /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
> + if (cpufreq_boost_supported()) {
> + policy->boost_enabled = cpufreq_boost_enabled();
> + ret = cpufreq_driver->set_boost(policy, policy->boost_enabled);
Maybe we can optimize here and not call set_boost() if policy's
boost_enabled is not changing at all.
if (policy->boost_enabled != cpufreq_boost_enabled()) {
policy->boost_enabled = cpufreq_boost_enabled();
ret = cpufreq_driver->set_boost(policy, policy->boost_enabled);
...
}
After this patch, maybe you should simplify the drivers as well, which
take care of enabling/boost at boot time or setting this flag ?
> + if (ret) {
> + /* If the set_boost fails, the online operation is not affected */
> + pr_info("%s: CPU%d: Cannot %s BOOST\n", __func__, policy->cpu,
> + policy->boost_enabled ? "enable" : "disable");
> + policy->boost_enabled = !policy->boost_enabled;
> + }
> + }
> +
> pr_debug("initialization complete\n");
>
> return 0;
--
viresh
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] cpufreq: Introduce a more generic way to set default per-policy boost flag
2025-01-16 6:54 ` Viresh Kumar
@ 2025-01-16 8:30 ` zhenglifeng (A)
0 siblings, 0 replies; 10+ messages in thread
From: zhenglifeng (A) @ 2025-01-16 8:30 UTC (permalink / raw)
To: Viresh Kumar
Cc: rafael, linux-pm, linux-kernel, linuxarm, jonathan.cameron,
zhanjie9, lihuisong, fanghao11
On 2025/1/16 14:54, Viresh Kumar wrote:
> On 15-01-25, 18:01, Lifeng Zheng wrote:
>> In cpufreq_online() of cpufreq.c, the per-policy boost flag is already set
>> to mirror the cpufreq_driver boost during init but using freq_table to
>> judge if the policy has boost frequency. There are two drawbacks to this
>> approach:
>>
>> 1. It doesn't work for the cpufreq drivers that do not use a frequency
>> table. For now, acpi-cpufreq and amd-pstate have to enable boost in policy
>> initialization. And cppc_cpufreq never set policy to boost when going
>> online no matter what the cpufreq_driver boost flag is.
>>
>> 2. If the cpu goes offline when cpufreq_driver boost enabled and then goes
>> online when cpufreq_driver boost disabled, the per-policy boost flag will
>> unreasonably remain true.
>
> Yeah, this is a problem. I agree. If the global boost is disabled,
> then boost shouldn't be allowed for any of the policies.
>
>> Running set_boost at the end of the online process is a more generic way
>> for all cpufreq drivers.
>>
>> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
>> ---
>> drivers/cpufreq/cpufreq.c | 16 ++++++++++++----
>> 1 file changed, 12 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
>> index 03ae879d50b9..867bda3decfd 100644
>> --- a/drivers/cpufreq/cpufreq.c
>> +++ b/drivers/cpufreq/cpufreq.c
>> @@ -1409,10 +1409,6 @@ static int cpufreq_online(unsigned int cpu)
>> goto out_free_policy;
>> }
>>
>> - /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
>> - if (cpufreq_boost_enabled() && policy_has_boost_freq(policy))
>> - policy->boost_enabled = true;
>> -
>> /*
>> * The initialization has succeeded and the policy is online.
>> * If there is a problem with its frequency table, take it
>> @@ -1576,6 +1572,18 @@ static int cpufreq_online(unsigned int cpu)
>> if (new_policy && cpufreq_thermal_control_enabled(cpufreq_driver))
>> policy->cdev = of_cpufreq_cooling_register(policy);
>>
>> + /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
>> + if (cpufreq_boost_supported()) {
>> + policy->boost_enabled = cpufreq_boost_enabled();
>> + ret = cpufreq_driver->set_boost(policy, policy->boost_enabled);
>
> Maybe we can optimize here and not call set_boost() if policy's
> boost_enabled is not changing at all.
> if (policy->boost_enabled != cpufreq_boost_enabled()) {
> policy->boost_enabled = cpufreq_boost_enabled();
> ret = cpufreq_driver->set_boost(policy, policy->boost_enabled);
> ...
> }
Makes sense. Thanks.
>
> After this patch, maybe you should simplify the drivers as well, which
> take care of enabling/boost at boot time or setting this flag ?
OK. I'll try to.
>
>> + if (ret) {
>> + /* If the set_boost fails, the online operation is not affected */
>> + pr_info("%s: CPU%d: Cannot %s BOOST\n", __func__, policy->cpu,
>> + policy->boost_enabled ? "enable" : "disable");
>> + policy->boost_enabled = !policy->boost_enabled;
>> + }
>> + }
>> +
>> pr_debug("initialization complete\n");
>>
>> return 0;
>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-01-16 8:30 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-15 10:01 [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online Lifeng Zheng
2025-01-15 10:01 ` [PATCH 1/2] cpufreq: Fix re-boost issue after hotplugging a cpu Lifeng Zheng
2025-01-15 11:18 ` Viresh Kumar
2025-01-15 12:50 ` Rafael J. Wysocki
2025-01-16 1:51 ` zhenglifeng (A)
2025-01-15 10:01 ` [PATCH 2/2] cpufreq: Introduce a more generic way to set default per-policy boost flag Lifeng Zheng
2025-01-16 6:54 ` Viresh Kumar
2025-01-16 8:30 ` zhenglifeng (A)
2025-01-15 12:53 ` [PATCH 0/2] cpufreq: Introduce a more generic way to boost when cpu is going online Rafael J. Wysocki
2025-01-16 2:08 ` zhenglifeng (A)
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®