Skip to content

Commit b32c64d

Browse files
cloehlegregkh
authored andcommitted
cpufreq: Initialize cpufreq-based invariance before subsys
[ Upstream commit 8ffe28b ] commit 2a6c727 ("cpufreq: Initialize cpufreq-based frequency-invariance later") postponed the frequency invariance initialization to avoid disabling it in the error case. This isn't locking safe, instead move the initialization up before the subsys interface is registered (which will rebuild the sched_domains) and add the corresponding disable on the error path. Observed lockdep without this patch: [ 0.989686] ====================================================== [ 0.989688] WARNING: possible circular locking dependency detected [ 0.989690] 6.17.0-rc4-cix-build+ Freescale#31 Tainted: G S [ 0.989691] ------------------------------------------------------ [ 0.989692] swapper/0/1 is trying to acquire lock: [ 0.989693] ffff800082ada7f8 (sched_energy_mutex){+.+.}-{4:4}, at: rebuild_sched_domains_energy+0x30/0x58 [ 0.989705] but task is already holding lock: [ 0.989706] ffff000088c89bc8 (&policy->rwsem){+.+.}-{4:4}, at: cpufreq_online+0x7f8/0xbe0 [ 0.989713] which lock already depends on the new lock. Fixes: 2a6c727 ("cpufreq: Initialize cpufreq-based frequency-invariance later") Signed-off-by: Christian Loehle <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent db28f97 commit b32c64d

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

drivers/cpufreq/cpufreq.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2853,6 +2853,15 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
28532853
goto err_null_driver;
28542854
}
28552855

2856+
/*
2857+
* Mark support for the scheduler's frequency invariance engine for
2858+
* drivers that implement target(), target_index() or fast_switch().
2859+
*/
2860+
if (!cpufreq_driver->setpolicy) {
2861+
static_branch_enable_cpuslocked(&cpufreq_freq_invariance);
2862+
pr_debug("cpufreq: supports frequency invariance\n");
2863+
}
2864+
28562865
ret = subsys_interface_register(&cpufreq_interface);
28572866
if (ret)
28582867
goto err_boost_unreg;
@@ -2874,21 +2883,14 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
28742883
hp_online = ret;
28752884
ret = 0;
28762885

2877-
/*
2878-
* Mark support for the scheduler's frequency invariance engine for
2879-
* drivers that implement target(), target_index() or fast_switch().
2880-
*/
2881-
if (!cpufreq_driver->setpolicy) {
2882-
static_branch_enable_cpuslocked(&cpufreq_freq_invariance);
2883-
pr_debug("supports frequency invariance");
2884-
}
2885-
28862886
pr_debug("driver %s up and running\n", driver_data->name);
28872887
goto out;
28882888

28892889
err_if_unreg:
28902890
subsys_interface_unregister(&cpufreq_interface);
28912891
err_boost_unreg:
2892+
if (!cpufreq_driver->setpolicy)
2893+
static_branch_disable_cpuslocked(&cpufreq_freq_invariance);
28922894
remove_boost_sysfs_file();
28932895
err_null_driver:
28942896
write_lock_irqsave(&cpufreq_driver_lock, flags);

0 commit comments

Comments
 (0)