Skip to content

Commit 8ffe28b

Browse files
cloehlerafaeljw
authored andcommitted
cpufreq: Initialize cpufreq-based invariance before subsys
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+ #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]>
1 parent f83ec76 commit 8ffe28b

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
@@ -2953,6 +2953,15 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
29532953
goto err_null_driver;
29542954
}
29552955

2956+
/*
2957+
* Mark support for the scheduler's frequency invariance engine for
2958+
* drivers that implement target(), target_index() or fast_switch().
2959+
*/
2960+
if (!cpufreq_driver->setpolicy) {
2961+
static_branch_enable_cpuslocked(&cpufreq_freq_invariance);
2962+
pr_debug("cpufreq: supports frequency invariance\n");
2963+
}
2964+
29562965
ret = subsys_interface_register(&cpufreq_interface);
29572966
if (ret)
29582967
goto err_boost_unreg;
@@ -2974,21 +2983,14 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
29742983
hp_online = ret;
29752984
ret = 0;
29762985

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

29892989
err_if_unreg:
29902990
subsys_interface_unregister(&cpufreq_interface);
29912991
err_boost_unreg:
2992+
if (!cpufreq_driver->setpolicy)
2993+
static_branch_disable_cpuslocked(&cpufreq_freq_invariance);
29922994
remove_boost_sysfs_file();
29932995
err_null_driver:
29942996
write_lock_irqsave(&cpufreq_driver_lock, flags);

0 commit comments

Comments
 (0)