]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
cpufreq: Split cpufreq_offline()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 11 May 2022 15:50:09 +0000 (17:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 16 Jun 2024 11:32:05 +0000 (13:32 +0200)
[ Upstream commit fddd8f86dff4a24742a7f0322ccbb34c6c1c9850 ]

Split the "core" part running under the policy rwsem out of
cpufreq_offline() to allow the locking in cpufreq_remove_dev() to be
rearranged more easily.

As a side-effect this eliminates the unlock label that's not needed
any more.

No expected functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Stable-dep-of: b8f85833c057 ("cpufreq: exit() callback is optional")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/cpufreq/cpufreq.c

index 97999bda188dd81615ff621da00be703079f793f..dd1acb55fe71786c182a2c32579089d920980b65 100644 (file)
@@ -1559,21 +1559,10 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
        return 0;
 }
 
-static int cpufreq_offline(unsigned int cpu)
+static void __cpufreq_offline(unsigned int cpu, struct cpufreq_policy *policy)
 {
-       struct cpufreq_policy *policy;
        int ret;
 
-       pr_debug("%s: unregistering CPU %u\n", __func__, cpu);
-
-       policy = cpufreq_cpu_get_raw(cpu);
-       if (!policy) {
-               pr_debug("%s: No cpu_data found\n", __func__);
-               return 0;
-       }
-
-       down_write(&policy->rwsem);
-
        if (has_target())
                cpufreq_stop_governor(policy);
 
@@ -1591,7 +1580,7 @@ static int cpufreq_offline(unsigned int cpu)
                                pr_err("%s: Failed to start governor\n", __func__);
                }
 
-               goto unlock;
+               return;
        }
 
        if (has_target())
@@ -1621,8 +1610,24 @@ static int cpufreq_offline(unsigned int cpu)
                cpufreq_driver->exit(policy);
                policy->freq_table = NULL;
        }
+}
+
+static int cpufreq_offline(unsigned int cpu)
+{
+       struct cpufreq_policy *policy;
+
+       pr_debug("%s: unregistering CPU %u\n", __func__, cpu);
+
+       policy = cpufreq_cpu_get_raw(cpu);
+       if (!policy) {
+               pr_debug("%s: No cpu_data found\n", __func__);
+               return 0;
+       }
+
+       down_write(&policy->rwsem);
+
+       __cpufreq_offline(cpu, policy);
 
-unlock:
        up_write(&policy->rwsem);
        return 0;
 }