Re: [PATCH v7 2/2] cpufreq: Add boost_freq_req QoS request
From: Pierre Gondois
Date: Thu Mar 26 2026 - 04:18:33 EST
On 3/26/26 06:03, Viresh Kumar wrote:
On 25-03-26, 17:52, Pierre Gondois wrote:Ok
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.cMaybe rename to `count` ?
@@ -1445,18 +1456,42 @@ static int cpufreq_policy_online(struct cpufreq_policy *policy,
cpumask_and(policy->cpus, policy->cpus, cpu_online_mask);
if (new_policy) {
+ unsigned int req_nr;
I thought there was an issue by adding boost last:
for_each_cpu(j, policy->related_cpus) {I would rather add this last: min -> max -> boost.
per_cpu(cpufreq_cpu_data, j) = policy;
add_cpu_dev_symlink(policy, j, get_cpu_device(j));
}
- policy->min_freq_req = kzalloc(2 * sizeof(*policy->min_freq_req),
+ req_nr = policy->boost_supported ? 3 : 2;
+ policy->min_freq_req = kzalloc(req_nr * sizeof(*policy->min_freq_req),
GFP_KERNEL);
if (!policy->min_freq_req) {
ret = -ENOMEM;
goto out_destroy_policy;
}
+ if (policy->boost_supported) {
And change the code in free as:
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 58e3839a2140..7f5d18da78c6 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1358,17 +1358,18 @@ static void cpufreq_policy_free(struct cpufreq_policy *policy)
/* Cancel any pending policy->update work before freeing the policy. */
cancel_work_sync(&policy->update);
- if (policy->max_freq_req) {
+ if (policy->boost_freq_req) {
/*
- * Remove max_freq_req after sending CPUFREQ_REMOVE_POLICY
+ * Remove boost_freq_req after sending CPUFREQ_REMOVE_POLICY
* notification, since CPUFREQ_CREATE_POLICY notification was
- * sent after adding max_freq_req earlier.
+ * sent after adding boost_freq_req earlier.
*/
blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
CPUFREQ_REMOVE_POLICY, policy);
- freq_qos_remove_request(policy->max_freq_req);
+ freq_qos_remove_request(policy->boost_freq_req);
}
+ freq_qos_remove_request(policy->max_freq_req);
freq_qos_remove_request(policy->min_freq_req);
kfree(policy->min_freq_req);
not all policies support boost frequencies (and thus requests).
So blocking_notifier_call_chain() should be called if:
+ if ((policy->max_freq_req && !policy->boost_supported) || + policy->boost_freq_req) {
This was in an earlier version, but Rafael and Lifeng suggested
to add boost_freq_req first to simplify the logic:
https://lore.kernel.org/all/20260225084930.1692228-3-pierre.gondois@xxxxxxx/
Ok+ policy->boost_freq_req = policy->min_freq_req + 2;Don't need a comment for obvious code ?
+
+ /*
+ * If boost is supported,
+ * init the constraint with cpuinfo.max_freq.
+ */
Ok
+ ret = freq_qos_add_request(&policy->constraints,Actually we are calling freq_qos_remove_request() for NULL values. This comment
+ policy->boost_freq_req,
+ FREQ_QOS_MAX,
+ policy->cpuinfo.max_freq);
+ if (ret < 0) {
+ /*
+ * So we don't call freq_qos_remove_request() for an
+ * uninitialized request.
+ */
and other exiting ones like this can be removed I guess. They aren't adding much
value.