Skip to content

Commit 383a92c

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+ torvalds#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 8c7c768 commit 383a92c

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
@@ -2792,6 +2792,15 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
27922792
goto err_null_driver;
27932793
}
27942794

2795+
/*
2796+
* Mark support for the scheduler's frequency invariance engine for
2797+
* drivers that implement target(), target_index() or fast_switch().
2798+
*/
2799+
if (!cpufreq_driver->setpolicy) {
2800+
static_branch_enable_cpuslocked(&cpufreq_freq_invariance);
2801+
pr_debug("cpufreq: supports frequency invariance\n");
2802+
}
2803+
27952804
ret = subsys_interface_register(&cpufreq_interface);
27962805
if (ret)
27972806
goto err_boost_unreg;
@@ -2814,21 +2823,14 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
28142823
hp_online = ret;
28152824
ret = 0;
28162825

2817-
/*
2818-
* Mark support for the scheduler's frequency invariance engine for
2819-
* drivers that implement target(), target_index() or fast_switch().
2820-
*/
2821-
if (!cpufreq_driver->setpolicy) {
2822-
static_branch_enable_cpuslocked(&cpufreq_freq_invariance);
2823-
pr_debug("supports frequency invariance");
2824-
}
2825-
28262826
pr_debug("driver %s up and running\n", driver_data->name);
28272827
goto out;
28282828

28292829
err_if_unreg:
28302830
subsys_interface_unregister(&cpufreq_interface);
28312831
err_boost_unreg:
2832+
if (!cpufreq_driver->setpolicy)
2833+
static_branch_disable_cpuslocked(&cpufreq_freq_invariance);
28322834
remove_boost_sysfs_file();
28332835
err_null_driver:
28342836
write_lock_irqsave(&cpufreq_driver_lock, flags);

0 commit comments

Comments
 (0)