Skip to content

Commit 79f8673

Browse files
finley1226Wenping Zhang
authored and
Wenping Zhang
committed
soc: rockchip: opp_select: Fix sleeping inside atomic context
This patch fixes the following warning: [ 2.226264] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:620 [ 2.226341] in_atomic(): 0, irqs_disabled(): 0, pid: 1, name: swapper/0 [ 2.226366] 4 locks held by swapper/0/1: [ 2.226385] #0: (&dev->mutex){......}, at: [<ffffff800851c664>] __device_attach+0x3c/0x134 [ 2.226515] #1: (cpu_hotplug.lock){......}, at: [<ffffff800809feb0>] get_online_cpus+0x38/0x9c [ 2.226594] #2: (subsys mutex#7){......}, at: [<ffffff800851b0e4>] subsys_interface_register+0x54/0xfc [ 2.226684] #3: (rcu_read_lock){......}, at: [<ffffff800845c764>] rockchip_adjust_power_scale+0x88/0x450 [ 2.226771] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 4.4.132 #600 [ 2.226790] Hardware name: Rockchip PX30 evb ddr3 board (DT) [ 2.226809] Call trace: [ 2.226840] [<ffffff800808a0d4>] dump_backtrace+0x0/0x1ec [ 2.226889] [<ffffff800808a2d4>] show_stack+0x14/0x1c [ 2.226918] [<ffffff80083c41b4>] dump_stack+0x94/0xbc [ 2.226946] [<ffffff80080cb708>] ___might_sleep+0x108/0x118 [ 2.226972] [<ffffff80080cb788>] __might_sleep+0x70/0x80 [ 2.227001] [<ffffff8008b6d1d0>] mutex_lock_nested+0x54/0x38c [ 2.227031] [<ffffff8008858714>] __of_clk_get_from_provider+0x44/0xec [ 2.227061] [<ffffff8008852814>] __of_clk_get_by_name+0xd4/0x14c [ 2.227112] [<ffffff80088528a4>] of_clk_get_by_name+0x18/0x28 [ 2.227140] [<ffffff800845c980>] rockchip_adjust_power_scale+0x2a4/0x450 [ 2.227171] [<ffffff800877f630>] cpufreq_init+0x154/0x394 [ 2.227199] [<ffffff8008776ac4>] cpufreq_online+0x1b0/0x68c [ 2.227225] [<ffffff8008777040>] cpufreq_add_dev+0x3c/0x94 [ 2.227253] [<ffffff800851b168>] subsys_interface_register+0xd8/0xfc [ 2.227281] [<ffffff80087772d8>] cpufreq_register_driver+0x10c/0x1a8 [ 2.227332] [<ffffff800877f93c>] dt_cpufreq_probe+0xcc/0xe8 [ 2.227360] [<ffffff800851e7b8>] platform_drv_probe+0x54/0xa8 [ 2.227385] [<ffffff800851c924>] driver_probe_device+0x194/0x278 [ 2.227411] [<ffffff800851cb40>] __device_attach_driver+0x60/0x9c [ 2.227439] [<ffffff800851ae14>] bus_for_each_drv+0x9c/0xbc [ 2.227464] [<ffffff800851c6f0>] __device_attach+0xc8/0x134 [ 2.227488] [<ffffff800851ccb8>] device_initial_probe+0x10/0x18 [ 2.227514] [<ffffff800851bcec>] bus_probe_device+0x2c/0x90 [ 2.227541] [<ffffff8008519e90>] device_add+0x44c/0x510 [ 2.227570] [<ffffff800851e4d4>] platform_device_add+0xa0/0x1e4 [ 2.227597] [<ffffff800851ef28>] platform_device_register_full+0xa4/0xe4 [ 2.227627] [<ffffff80090f8680>] rockchip_cpufreq_driver_init+0xd4/0x31c [ 2.227654] [<ffffff8008083468>] do_one_initcall+0x84/0x1a4 [ 2.227682] [<ffffff80090c0e98>] kernel_init_freeable+0x260/0x264 [ 2.227708] [<ffffff8008b6ab68>] kernel_init+0x10/0xf8 [ 2.227734] [<ffffff80080832a0>] ret_from_fork+0x10/0x30 Fixes: 197a2d3 ("soc: rockchip: opp_select: add missing rcu lock") Change-Id: Ib52b6f7bc77bb207a1c8c6880f7a5e916fa3d2ee Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
1 parent 11cbf55 commit 79f8673

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

drivers/soc/rockchip/rockchip_opp_select.c

+12-6
Original file line numberDiff line numberDiff line change
@@ -590,15 +590,15 @@ static int rockchip_adjust_opp_by_irdrop(struct device *dev,
590590
count = dev_pm_opp_get_opp_count(dev);
591591
if (count <= 0) {
592592
ret = count ? count : -ENODATA;
593-
goto out;
593+
goto unlock;
594594
}
595595

596596
for (i = 0, rate = 0; i < count; i++, rate++) {
597597
/* find next rate */
598598
opp = dev_pm_opp_find_freq_ceil(dev, &rate);
599599
if (IS_ERR(opp)) {
600600
ret = PTR_ERR(opp);
601-
goto out;
601+
goto unlock;
602602
}
603603
board_irdrop = rockchip_of_get_irdrop(np, opp->rate);
604604
if (IS_ERR_VALUE(board_irdrop))
@@ -621,9 +621,18 @@ static int rockchip_adjust_opp_by_irdrop(struct device *dev,
621621
}
622622
}
623623

624+
unlock:
625+
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
626+
rcu_read_unlock();
627+
#endif
628+
if (ret)
629+
goto out;
630+
624631
clk = of_clk_get_by_name(np, NULL);
625-
if (IS_ERR(clk))
632+
if (IS_ERR(clk)) {
633+
ret = PTR_ERR(clk);
626634
goto out;
635+
}
627636
if (safe_opp && safe_opp != opp && irdrop_scale) {
628637
*irdrop_scale = rockchip_pll_clk_rate_to_scale(clk,
629638
safe_opp->rate);
@@ -634,9 +643,6 @@ static int rockchip_adjust_opp_by_irdrop(struct device *dev,
634643
clk_put(clk);
635644

636645
out:
637-
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
638-
rcu_read_unlock();
639-
#endif
640646
return ret;
641647
}
642648

0 commit comments

Comments
 (0)