Re: [PATCH v2 1/3] cpufreq: CPPC: Keep the policy across CPU hotplug

Sumit Gupta <[email protected]>
Newsgroups org.kernel.vger.linux-acpi,dev.linux.lists.acpica-devel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm,org.kernel.vger.linux-tegra
Message-ID <[email protected]>
On 22/07/26 15:48, Christian Loehle wrote:
> External email: Use caution opening links or attachments
>
>
> On 7/16/26 16:38, Sumit Gupta wrote:
>> Without online()/offline() callbacks, the cpufreq core fully tears
>> down a policy during exit() when its last online CPU is offlined,
>> and rebuilds it during init() when it comes back.
>>
>> Add lightweight online()/offline() callbacks so the core instead
>> keeps the policy live and reuses the driver's cpu_data across
>> CPU hotplug. This avoids re-reading the CPPC capabilities on every
>> offline/online, making CPU hotplug faster.
>>
>> Re-enable CPPC from online(), as it may have been disabled while
>> the CPU was offline.
>>
>> Signed-off-by: Sumit Gupta <[email protected]>
>> ---
>>   drivers/cpufreq/cppc_cpufreq.c | 27 +++++++++++++++++++++++++++
>>   1 file changed, 27 insertions(+)
>>
>> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
>> index f6cea0c54dd9..432c6a6288a7 100644
>> --- a/drivers/cpufreq/cppc_cpufreq.c
>> +++ b/drivers/cpufreq/cppc_cpufreq.c
>> @@ -722,6 +722,31 @@ static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy)
>>        return ret;
>>   }
>>
>> +/*
>> + * With offline() defined, the cpufreq core keeps the policy alive when
>> + * a CPU is hotplugged out.
>> + */
>> +static int cppc_cpufreq_cpu_offline(struct cpufreq_policy *policy)
>> +{
>> +     return 0;
>> +}
>> +
>> +/*
>> + * Re-enable CPPC when the policy's CPU comes back online, since the platform
>> + * may have disabled it while the CPU was offline.
>> + */
>> +static int cppc_cpufreq_cpu_online(struct cpufreq_policy *policy)
>> +{
>> +     unsigned int cpu = policy->cpu;
>> +     int ret;
>> +
>> +     ret = cppc_set_enable(cpu, true);
>> +     if (ret && ret != -EOPNOTSUPP)
>> +             pr_warn("Failed to re-enable CPPC for CPU%d (%d)\n", cpu, ret);
> Keeping the policy alive means cpu_data->perf_ctrls survives hotplug, but the callback does not
> reapply it. A governor restart does not guarantee an immediate target callback, so the controls
> may remain reset indefinitely.
>
> I think the online path needs to restore a complete, current performance-control request before
> returning. MIN/MAX should be recomputed from the policy and the last requested DESIRED value
> clamped into that range.

Agreed.
Will change online() to recompute MIN/MAX from the policy and clamp the
retained DESIRED into that range, as described in my reply on patch 3/3.

>
> Also, what about suspend/resume?
>

Good point. On the platform I test on these registers are retained
across both hotplug and suspend, so I left suspend/resume out initially.
But the same mechanism extends to platforms that do reset them.
So I will add it as its own patch in v3 where suspend() saves the
OSPM set values and resume() restores them, reusing the online() path.

Thanks,
Sumit

....
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.