linux/drivers/cpufreq
Srivatsa S. Bhat 1aee40ac9c cpufreq: Invoke __cpufreq_remove_dev_finish() after releasing cpu_hotplug.lock
__cpufreq_remove_dev_finish() handles the kobject cleanup for a CPU going
offline. But because we destroy the kobject towards the end of the CPU offline
phase, there are certain race windows where a task can try to write to a
cpufreq sysfs file (eg: using store_scaling_max_freq()) while we are taking
that CPU offline, and this can bump up the kobject refcount, which in turn might
hinder the CPU offline task from running to completion. (It can also cause
other more serious problems such as trying to acquire a destroyed timer-mutex
etc., depending on the exact stage of the cleanup at which the task managed to
take a new refcount).

To fix the race window, we will need to synchronize those store_*() call-sites
with CPU hotplug, using get_online_cpus()/put_online_cpus(). However, that
in turn can cause a total deadlock because it can end up waiting for the
CPU offline task to complete, with incremented refcount!

Write to sysfs                            CPU offline task
--------------                            ----------------
kobj_refcnt++

                                          Acquire cpu_hotplug.lock

get_online_cpus();

					  Wait for kobj_refcnt to drop to zero

                     **DEADLOCK**

A simple way to avoid this problem is to perform the kobject cleanup in the
CPU offline path, with the cpu_hotplug.lock *released*. That is, we can
perform the wait-for-kobj-refcnt-to-drop as well as the subsequent cleanup
in the CPU_POST_DEAD stage of CPU offline, which is run with cpu_hotplug.lock
released. Doing this helps us avoid deadlocks due to holding kobject refcounts
and waiting on each other on the cpu_hotplug.lock.

(Note: We can't move all of the cpufreq CPU offline steps to the
CPU_POST_DEAD stage, because certain things such as stopping the governors
have to be done before the outgoing CPU is marked offline. So retain those
parts in the CPU_DOWN_PREPARE stage itself).

Reported-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2013-09-10 02:49:47 +02:00
..
acpi-cpufreq.c acpi-cpufreq: Use cpufreq_freq_attr_rw to define the cpb attribute 2013-08-14 22:24:22 +02:00
amd_freq_sensitivity.c cpufreq: AMD "frequency sensitivity feedback" powersave bias for ondemand governor 2013-04-10 13:19:26 +02:00
arm_big_little_dt.c cpufreq: arm_big_little: remove device tree parsing for cpu nodes 2013-08-21 10:29:55 +01:00
arm_big_little.c cpufreq: arm-big-little: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 18:18:58 +05:30
arm_big_little.h cpufreq: ARM big LITTLE: Move cpu_to_cluster() to arm_big_little.h 2013-05-12 14:04:15 +02:00
at32ap-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
blackfin-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
cpufreq_conservative.c cpufreq: governors: Remove duplicate check of target freq in supported range 2013-08-28 22:03:02 +02:00
cpufreq_governor.c cpufreq: Don't use smp_processor_id() in preemptible context 2013-08-29 22:19:23 +02:00
cpufreq_governor.h cpufreq: governor: Fix typos in comments 2013-08-28 22:04:54 +02:00
cpufreq_ondemand.c cpufreq: governors: Remove duplicate check of target freq in supported range 2013-08-28 22:03:02 +02:00
cpufreq_performance.c cpufreq: Clean up header files included in the core 2013-08-07 23:34:09 +02:00
cpufreq_powersave.c cpufreq: Clean up header files included in the core 2013-08-07 23:34:09 +02:00
cpufreq_stats.c cpufreq: Fix wrong time unit conversion 2013-09-10 02:49:46 +02:00
cpufreq_userspace.c cpufreq: Fix minor formatting issues 2013-06-21 01:06:34 +02:00
cpufreq-cpu0.c Merge branch 'cpu_of_node' of git://linux-arm.org/linux-skn into pm-cpufreq-next 2013-08-23 00:57:19 +02:00
cpufreq-nforce2.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
cpufreq.c cpufreq: Invoke __cpufreq_remove_dev_finish() after releasing cpu_hotplug.lock 2013-09-10 02:49:47 +02:00
cris-artpec3-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
cris-etraxfs-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
davinci-cpufreq.c cpufreq: davinci: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 18:18:58 +05:30
dbx500-cpufreq.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
e_powersaver.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
elanfreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
exynos4x12-cpufreq.c arm-soc: cleanups 2013-02-21 14:58:40 -08:00
exynos4210-cpufreq.c arm-soc: cleanups 2013-02-21 14:58:40 -08:00
exynos5250-cpufreq.c arm-soc: cleanups 2013-02-21 14:58:40 -08:00
exynos5440-cpufreq.c cpufreq: exynos5440: Fix to skip when new frequency same as current 2013-08-12 12:00:18 +05:30
exynos-cpufreq.c Merge branch 'cpufreq-fixes' of git://git.linaro.org/people/vireshk/linux into pm-cpufreq 2013-08-14 22:22:57 +02:00
exynos-cpufreq.h cpufreq: fix EXYNOS drivers selection 2013-08-12 12:00:21 +05:30
freq_table.c cpufreq: Clean up header files included in the core 2013-08-07 23:34:09 +02:00
gx-suspmod.c cpufreq / gx: Fix gx_detect_chipset() __init attribute location 2013-08-14 22:24:23 +02:00
highbank-cpufreq.c cpufreq: highbank-cpufreq: remove device tree parsing for cpu nodes 2013-08-21 10:29:54 +01:00
ia64-acpi-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
imx6q-cpufreq.c Merge branch 'cpufreq-fixes' of git://git.linaro.org/people/vireshk/linux into pm-cpufreq 2013-08-27 02:37:54 +02:00
integrator-cpufreq.c cpufreq: integrator: move cpufreq driver to drivers/cpufreq 2013-04-08 13:02:31 +02:00
intel_pstate.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
Kconfig cpufreq: Fix incorrect dependecies for ARM SA11xx drivers 2013-05-12 14:04:16 +02:00
Kconfig.arm cpufreq: fix EXYNOS drivers selection 2013-08-12 12:00:21 +05:30
Kconfig.powerpc Merge branch 'pm-cpufreq-assorted' into pm-cpufreq 2013-06-27 21:46:45 +02:00
Kconfig.x86 cpufreq: X86_AMD_FREQ_SENSITIVITY: select CPU_FREQ_TABLE 2013-06-18 13:53:11 +05:30
kirkwood-cpufreq.c Merge branch 'cpu_of_node' of git://linux-arm.org/linux-skn into pm-cpufreq-next 2013-08-23 00:57:19 +02:00
longhaul.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
longhaul.h cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
longrun.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
loongson2_cpufreq.c Merge back earlier 'pm-cpufreq' material 2013-08-14 22:21:16 +02:00
Makefile cpufreq: Remove unused APERF/MPERF support 2013-07-26 01:06:43 +02:00
maple-cpufreq.c Merge branch 'cpu_of_node' of git://linux-arm.org/linux-skn into pm-cpufreq-next 2013-08-23 00:57:19 +02:00
omap-cpufreq.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
p4-clockmod.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
pasemi-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
pcc-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
pmac32-cpufreq.c Merge branch 'cpu_of_node' of git://linux-arm.org/linux-skn into pm-cpufreq-next 2013-08-23 00:57:19 +02:00
pmac64-cpufreq.c Merge branch 'cpu_of_node' of git://linux-arm.org/linux-skn into pm-cpufreq-next 2013-08-23 00:57:19 +02:00
powernow-k6.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
powernow-k7.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
powernow-k7.h [CPUFREQ] Move x86 drivers to drivers/cpufreq/ 2011-05-19 18:51:07 -04:00
powernow-k8.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
powernow-k8.h cpufreq: Remove support for hardware P-state chips from powernow-k8 2012-09-09 22:05:30 +02:00
ppc_cbe_cpufreq_pervasive.c cpufreq: powerpc/platforms/cell: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:26 +02:00
ppc_cbe_cpufreq_pmi.c cpufreq: powerpc/platforms/cell: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:26 +02:00
ppc_cbe_cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
ppc_cbe_cpufreq.h cpufreq: powerpc/platforms/cell: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:26 +02:00
ppc-corenet-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
pxa2xx-cpufreq.c cpufreq / pxa2xx: Fix pxa_cpufreq_init_voltages() __init attribute location 2013-08-14 22:24:23 +02:00
pxa3xx-cpufreq.c pxa3xx-cpufreq.c: Avoid using ARRAY_AND_SIZE(e) as a function argument 2013-08-14 22:24:23 +02:00
s3c24xx-cpufreq-debugfs.c cpufreq: s3c24xx: move cpufreq driver to drivers/cpufreq 2013-05-20 23:04:28 +09:00
s3c24xx-cpufreq.c cpufreq / s3c24xx: Fix s3c_cpufreq_initclks() __init attribute location 2013-08-14 22:24:24 +02:00
s3c64xx-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
s3c2410-cpufreq.c cpufreq: s3c24xx: move cpufreq driver to drivers/cpufreq 2013-05-20 23:04:28 +09:00
s3c2412-cpufreq.c cpufreq: s3c24xx: move cpufreq driver to drivers/cpufreq 2013-05-20 23:04:28 +09:00
s3c2416-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
s3c2440-cpufreq.c cpufreq: s3c24xx: move cpufreq driver to drivers/cpufreq 2013-05-20 23:04:28 +09:00
s5pv210-cpufreq.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
sa1100-cpufreq.c cpufreq: sa11x0: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:24 +02:00
sa1110-cpufreq.c cpufreq: sa11x0: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:24 +02:00
sc520_freq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
sh-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
sparc-us2e-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
sparc-us3-cpufreq.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
spear-cpufreq.c cpufreq: spear-cpufreq: remove device tree parsing for cpu nodes 2013-08-21 10:29:54 +01:00
speedstep-centrino.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
speedstep-ich.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
speedstep-lib.c cpufreq: Add support for x86 cpuinfo auto loading v4 2012-01-26 16:49:06 -08:00
speedstep-lib.h [CPUFREQ] Move x86 drivers to drivers/cpufreq/ 2011-05-19 18:51:07 -04:00
speedstep-smi.c cpufreq: Drop the owner field from struct cpufreq_driver 2013-08-10 03:24:47 +02:00
tegra-cpufreq.c cpufreq: tegra: fix the wrong clock name 2013-08-23 21:58:28 +05:30
unicore2-cpufreq.c cpufreq: unicore2: Staticize local symbol 2013-08-14 22:24:24 +02:00