]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
cpufreq: Split cpufreq_online()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 28 Mar 2025 20:41:49 +0000 (21:41 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 9 Apr 2025 19:21:58 +0000 (21:21 +0200)
In preparation for the introduction of cpufreq policy locking guards,
move the part of cpufreq_online() that is carried out under the policy
rwsem into a separate function called cpufreq_policy_online().

No intentional functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Acked-by: Sudeep Holla <sudeep.holla@arm.com>
Tested-by: Sudeep Holla <sudeep.holla@arm.com>
Link: https://patch.msgid.link/3354747.aeNJFYEL58@rjwysocki.net
drivers/cpufreq/cpufreq.c

index 72c31a99c5c3232b8a6071bda075307bb26efe46..31ede4d998d22d3fbfb440fc4ec9e98e0111976d 100644 (file)
@@ -1402,32 +1402,13 @@ static void cpufreq_policy_free(struct cpufreq_policy *policy)
        kfree(policy);
 }
 
-static int cpufreq_online(unsigned int cpu)
+static int cpufreq_policy_online(struct cpufreq_policy *policy,
+                                unsigned int cpu, bool new_policy)
 {
-       struct cpufreq_policy *policy;
-       bool new_policy;
        unsigned long flags;
        unsigned int j;
        int ret;
 
-       pr_debug("%s: bringing CPU%u online\n", __func__, cpu);
-
-       /* Check if this CPU already has a policy to manage it */
-       policy = per_cpu(cpufreq_cpu_data, cpu);
-       if (policy) {
-               WARN_ON(!cpumask_test_cpu(cpu, policy->related_cpus));
-               if (!policy_is_inactive(policy))
-                       return cpufreq_add_policy_cpu(policy, cpu);
-
-               /* This is the only online CPU for the policy.  Start over. */
-               new_policy = false;
-       } else {
-               new_policy = true;
-               policy = cpufreq_policy_alloc(cpu);
-               if (!policy)
-                       return -ENOMEM;
-       }
-
        down_write(&policy->rwsem);
 
        policy->cpu = cpu;
@@ -1454,7 +1435,7 @@ static int cpufreq_online(unsigned int cpu)
                if (ret) {
                        pr_debug("%s: %d: initialization failed\n", __func__,
                                 __LINE__);
-                       goto out_free_policy;
+                       goto out_clear_policy;
                }
 
                /*
@@ -1605,8 +1586,59 @@ static int cpufreq_online(unsigned int cpu)
                goto out_destroy_policy;
        }
 
+out_unlock:
        up_write(&policy->rwsem);
 
+       return ret;
+
+out_destroy_policy:
+       for_each_cpu(j, policy->real_cpus)
+               remove_cpu_dev_symlink(policy, j, get_cpu_device(j));
+
+out_offline_policy:
+       if (cpufreq_driver->offline)
+               cpufreq_driver->offline(policy);
+
+out_exit_policy:
+       if (cpufreq_driver->exit)
+               cpufreq_driver->exit(policy);
+
+out_clear_policy:
+       cpumask_clear(policy->cpus);
+
+       goto out_unlock;
+}
+
+static int cpufreq_online(unsigned int cpu)
+{
+       struct cpufreq_policy *policy;
+       bool new_policy;
+       int ret;
+
+       pr_debug("%s: bringing CPU%u online\n", __func__, cpu);
+
+       /* Check if this CPU already has a policy to manage it */
+       policy = per_cpu(cpufreq_cpu_data, cpu);
+       if (policy) {
+               WARN_ON(!cpumask_test_cpu(cpu, policy->related_cpus));
+               if (!policy_is_inactive(policy))
+                       return cpufreq_add_policy_cpu(policy, cpu);
+
+               /* This is the only online CPU for the policy.  Start over. */
+               new_policy = false;
+       } else {
+               new_policy = true;
+               policy = cpufreq_policy_alloc(cpu);
+               if (!policy)
+                       return -ENOMEM;
+       }
+
+       ret = cpufreq_policy_online(policy, cpu, new_policy);
+       if (ret) {
+               cpufreq_policy_free(policy);
+               return ret;
+       }
+
        kobject_uevent(&policy->kobj, KOBJ_ADD);
 
        /* Callback for handling stuff after policy is ready */
@@ -1633,25 +1665,6 @@ static int cpufreq_online(unsigned int cpu)
        pr_debug("initialization complete\n");
 
        return 0;
-
-out_destroy_policy:
-       for_each_cpu(j, policy->real_cpus)
-               remove_cpu_dev_symlink(policy, j, get_cpu_device(j));
-
-out_offline_policy:
-       if (cpufreq_driver->offline)
-               cpufreq_driver->offline(policy);
-
-out_exit_policy:
-       if (cpufreq_driver->exit)
-               cpufreq_driver->exit(policy);
-
-out_free_policy:
-       cpumask_clear(policy->cpus);
-       up_write(&policy->rwsem);
-
-       cpufreq_policy_free(policy);
-       return ret;
 }
 
 /**