Viresh Kumar
4e97b631f2
cpufreq: Initialize governor for a new policy under policy->rwsem
...
policy->rwsem is used to lock access to all parts of code modifying
struct cpufreq_policy, but it's not used on a new policy created by
__cpufreq_add_dev().
Because of that, if cpufreq_update_policy() is called in a tight loop
on one CPU in parallel with offline/online of another CPU, then the
following crash can be triggered:
Unable to handle kernel NULL pointer dereference at virtual address 00000020
pgd = c0003000
[00000020] *pgd=80000000004003, *pmd=00000000
Internal error: Oops: 206 [#1 ] PREEMPT SMP ARM
PC is at __cpufreq_governor+0x10/0x1ac
LR is at cpufreq_update_policy+0x114/0x150
---[ end trace f23a8defea6cd706 ]---
Kernel panic - not syncing: Fatal exception
CPU0: stopping
CPU: 0 PID: 7136 Comm: mpdecision Tainted: G D W 3.10.0-gd727407-00074-g979ede8 #396
[<c0afe180>] (notifier_call_chain+0x40/0x68) from [<c02a23ac>] (__blocking_notifier_call_chain+0x40/0x58)
[<c02a23ac>] (__blocking_notifier_call_chain+0x40/0x58) from [<c02a23d8>] (blocking_notifier_call_chain+0x14/0x1c)
[<c02a23d8>] (blocking_notifier_call_chain+0x14/0x1c) from [<c0803c68>] (cpufreq_set_policy+0xd4/0x2b8)
[<c0803c68>] (cpufreq_set_policy+0xd4/0x2b8) from [<c0803e7c>] (cpufreq_init_policy+0x30/0x98)
[<c0803e7c>] (cpufreq_init_policy+0x30/0x98) from [<c0805a18>] (__cpufreq_add_dev.isra.17+0x4dc/0x7a4)
[<c0805a18>] (__cpufreq_add_dev.isra.17+0x4dc/0x7a4) from [<c0805d38>] (cpufreq_cpu_callback+0x58/0x84)
[<c0805d38>] (cpufreq_cpu_callback+0x58/0x84) from [<c0afe180>] (notifier_call_chain+0x40/0x68)
[<c0afe180>] (notifier_call_chain+0x40/0x68) from [<c02812dc>] (__cpu_notify+0x28/0x44)
[<c02812dc>] (__cpu_notify+0x28/0x44) from [<c0aeed90>] (_cpu_up+0xf4/0x1dc)
[<c0aeed90>] (_cpu_up+0xf4/0x1dc) from [<c0aeeed4>] (cpu_up+0x5c/0x78)
[<c0aeeed4>] (cpu_up+0x5c/0x78) from [<c0aec808>] (store_online+0x44/0x74)
[<c0aec808>] (store_online+0x44/0x74) from [<c03a40f4>] (sysfs_write_file+0x108/0x14c)
[<c03a40f4>] (sysfs_write_file+0x108/0x14c) from [<c03517d4>] (vfs_write+0xd0/0x180)
[<c03517d4>] (vfs_write+0xd0/0x180) from [<c0351ca8>] (SyS_write+0x38/0x68)
[<c0351ca8>] (SyS_write+0x38/0x68) from [<c0205de0>] (ret_fast_syscall+0x0/0x30)
Fix that by taking locks at appropriate places in __cpufreq_add_dev()
as well.
Reported-by: Saravana Kannan <skannan@codeaurora.org>
Suggested-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
[rjw: Changelog]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2014-03-06 13:25:30 +01:00
..
acpi-cpufreq.c
acpi-cpufreq: De-register CPU notifier and free struct msr on error.
2014-01-28 22:36:30 +01:00
amd_freq_sensitivity.c
arm_big_little.c
cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag
2014-01-06 14:17:25 +01:00
arm_big_little.h
cpufreq: arm_big_little: add in-kernel switching (IKS) support
2013-10-31 00:10:53 +01:00
arm_big_little_dt.c
PM / OPP: rename header to linux/pm_opp.h
2013-10-25 22:33:23 +02:00
at32ap-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
blackfin-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
cpufreq-cpu0.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
2014-01-24 17:13:49 -08:00
cpufreq-nforce2.c
cpufreq: nforce2: don't initialize part of policy set by core
2013-10-16 00:50:29 +02:00
cpufreq.c
cpufreq: Initialize governor for a new policy under policy->rwsem
2014-03-06 13:25:30 +01:00
cpufreq_conservative.c
cpufreq: conservative: set requested_freq to policy max when it is over policy max
2013-11-12 23:18:20 +01:00
cpufreq_governor.c
cpufreq: Fix timer/workqueue corruption by protecting reading governor_enabled
2014-01-06 01:22:02 +01:00
cpufreq_governor.h
cpufreq: Fix timer/workqueue corruption by protecting reading governor_enabled
2014-01-06 01:22:02 +01:00
cpufreq_ondemand.c
cpufreq: ondemand: Remove redundant return statement
2013-11-01 00:44:34 +01:00
cpufreq_performance.c
cpufreq_powersave.c
cpufreq_stats.c
cpufreq: stats: create sysfs entries when cpufreq_stats is a module
2014-01-17 02:00:44 +01:00
cpufreq_userspace.c
cpufreq / governor: Remove fossil comment
2013-10-17 23:00:20 +02:00
cris-artpec3-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
cris-etraxfs-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
davinci-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
dbx500-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
e_powersaver.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
elanfreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
exynos-cpufreq.c
cpufreq: exynos: Extend Exynos cpufreq driver to support boost
2014-01-17 02:00:45 +01:00
exynos-cpufreq.h
cpufreq: exynos: move definitions for exynos-cpufreq into drivers/cpufreq/
2013-12-19 05:21:18 +09:00
exynos4x12-cpufreq.c
ACPI and power management updates for 3.14-rc1
2014-01-24 15:51:02 -08:00
exynos4210-cpufreq.c
Samsung cleanup 2nd for v3.14
2013-12-28 15:12:07 -08:00
exynos5250-cpufreq.c
ACPI and power management updates for 3.14-rc1
2014-01-24 15:51:02 -08:00
exynos5440-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
freq_table.c
cpufreq: Add boost frequency support in core
2014-01-17 02:00:44 +01:00
gx-suspmod.c
cpufreq: gx: don't initialize part of policy set by core
2013-10-16 00:50:30 +02:00
highbank-cpufreq.c
cpufreq: highbank-cpufreq: Enable Midway/ECX-2000
2013-10-17 00:53:08 +02:00
ia64-acpi-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
imx6q-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
integrator-cpufreq.c
cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag
2014-01-06 14:17:25 +01:00
intel_pstate.c
intel_pstate: Change busy calculation to use fixed point math.
2014-02-26 00:56:49 +01:00
Kconfig
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
2014-01-24 17:13:49 -08:00
Kconfig.arm
cpufreq / boost: Kconfig: Support for software-managed BOOST
2014-01-17 02:00:45 +01:00
Kconfig.powerpc
cpufreq: remove CONFIG_CPU_FREQ_TABLE
2013-10-16 00:50:33 +02:00
Kconfig.x86
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial
2013-11-15 16:47:22 -08:00
kirkwood-cpufreq.c
cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag
2014-01-06 14:17:25 +01:00
longhaul.c
cpufreq: Implement light weight ->target_index() routine
2013-10-25 22:42:24 +02:00
longhaul.h
longrun.c
loongson2_cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
Makefile
cpufreq: arm_big_little: add vexpress SPC interface driver
2013-10-30 00:48:26 +01:00
maple-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
omap-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
p4-clockmod.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
pasemi-cpufreq.c
ACPI and power management updates for 3.13-rc1
2013-11-14 13:41:48 +09:00
pcc-cpufreq.c
cpufreq: send new set of notification for transition failures
2014-01-06 01:43:44 +01:00
pmac32-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
pmac64-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
powernow-k6.c
powernow-k6: reorder frequencies
2014-01-06 15:53:07 +01:00
powernow-k7.c
cpufreq: Implement light weight ->target_index() routine
2013-10-25 22:42:24 +02:00
powernow-k7.h
powernow-k8.c
cpufreq: powernow-k8: Initialize per-cpu data-structures properly
2014-02-19 01:04:56 +01:00
powernow-k8.h
ppc-corenet-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
ppc_cbe_cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
ppc_cbe_cpufreq.h
ppc_cbe_cpufreq_pervasive.c
ppc_cbe_cpufreq_pmi.c
pxa2xx-cpufreq.c
cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag
2014-01-06 14:17:25 +01:00
pxa3xx-cpufreq.c
cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag
2014-01-06 14:17:25 +01:00
s3c24xx-cpufreq-debugfs.c
s3c24xx-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
s3c64xx-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
s3c2410-cpufreq.c
s3c2412-cpufreq.c
s3c2416-cpufreq.c
cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag
2014-01-06 14:17:25 +01:00
s3c2440-cpufreq.c
cpufreq: s3c2440: Staticize local variables
2014-01-06 01:18:33 +01:00
s5pv210-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
sa1100-cpufreq.c
cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag
2014-01-06 14:17:25 +01:00
sa1110-cpufreq.c
cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag
2014-01-06 14:17:25 +01:00
sc520_freq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
sh-cpufreq.c
cpufreq: sh: don't initialize part of policy set by core
2013-10-16 00:50:32 +02:00
sparc-us2e-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
sparc-us3-cpufreq.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
spear-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
speedstep-centrino.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
speedstep-ich.c
cpufreq: move freq change notifications to cpufreq core
2013-10-31 00:11:08 +01:00
speedstep-lib.c
speedstep-lib.h
speedstep-smi.c
cpufreq: speedstep: remove unused speedstep_get_state
2014-01-17 02:00:43 +01:00
tegra-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
unicore2-cpufreq.c
cpufreq: introduce cpufreq_generic_get() routine
2014-01-17 02:00:44 +01:00
vexpress-spc-cpufreq.c
cpufreq: arm_big_little: add vexpress SPC interface driver
2013-10-30 00:48:26 +01:00