Skip to content

Commit bd62c0b

Browse files
cloehleopsiff
authored andcommitted
cpufreq: Initialize cpufreq-based invariance before subsys
[ Upstream commit 8ffe28b4e8d8b18cb2f2933410322c24f039d5d6 ] commit 2a6c72738706 ("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+ deepin-community#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: 2a6c72738706 ("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]> (cherry picked from commit 6017196aabf1dfd1cffa7d9a109317eabf8c477e)
1 parent 0a514b6 commit bd62c0b

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
@@ -2950,6 +2950,15 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
29502950
goto err_null_driver;
29512951
}
29522952

2953+
/*
2954+
* Mark support for the scheduler's frequency invariance engine for
2955+
* drivers that implement target(), target_index() or fast_switch().
2956+
*/
2957+
if (!cpufreq_driver->setpolicy) {
2958+
static_branch_enable_cpuslocked(&cpufreq_freq_invariance);
2959+
pr_debug("cpufreq: supports frequency invariance\n");
2960+
}
2961+
29532962
ret = subsys_interface_register(&cpufreq_interface);
29542963
if (ret)
29552964
goto err_boost_unreg;
@@ -2971,21 +2980,14 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
29712980
hp_online = ret;
29722981
ret = 0;
29732982

2974-
/*
2975-
* Mark support for the scheduler's frequency invariance engine for
2976-
* drivers that implement target(), target_index() or fast_switch().
2977-
*/
2978-
if (!cpufreq_driver->setpolicy) {
2979-
static_branch_enable_cpuslocked(&cpufreq_freq_invariance);
2980-
pr_debug("supports frequency invariance");
2981-
}
2982-
29832983
pr_debug("driver %s up and running\n", driver_data->name);
29842984
goto out;
29852985

29862986
err_if_unreg:
29872987
subsys_interface_unregister(&cpufreq_interface);
29882988
err_boost_unreg:
2989+
if (!cpufreq_driver->setpolicy)
2990+
static_branch_disable_cpuslocked(&cpufreq_freq_invariance);
29892991
remove_boost_sysfs_file();
29902992
err_null_driver:
29912993
write_lock_irqsave(&cpufreq_driver_lock, flags);

0 commit comments

Comments
 (0)