linux/drivers/cpufreq
Srivatsa S. Bhat 4f750c9308 cpufreq: Synchronize the cpufreq store_*() routines with CPU hotplug
The functions that are used to write to cpufreq sysfs files (such as
store_scaling_max_freq()) are not hotplug safe. They can race with CPU
hotplug tasks and lead to problems such as trying to acquire an already
destroyed timer-mutex etc.

Eg:

    __cpufreq_remove_dev()
     __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
       policy->governor->governor(policy, CPUFREQ_GOV_STOP);
        cpufreq_governor_dbs()
         case CPUFREQ_GOV_STOP:
          mutex_destroy(&cpu_cdbs->timer_mutex)
          cpu_cdbs->cur_policy = NULL;
      <PREEMPT>
    store()
     __cpufreq_set_policy()
      __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
        policy->governor->governor(policy, CPUFREQ_GOV_LIMITS);
         case CPUFREQ_GOV_LIMITS:
          mutex_lock(&cpu_cdbs->timer_mutex); <-- Warning (destroyed mutex)
           if (policy->max < cpu_cdbs->cur_policy->cur) <- cur_policy == NULL

So use get_online_cpus()/put_online_cpus() in the store_*() functions, to
synchronize with CPU hotplug. However, there is an additional point to note
here: some parts of the CPU teardown in the cpufreq subsystem are done in
the CPU_POST_DEAD stage, with cpu_hotplug.lock *released*. So, using the
get/put_online_cpus() functions alone is insufficient; we should also ensure
that we don't race with those latter steps in the hotplug sequence. We can
easily achieve this by checking if the CPU is online before proceeding with
the store, since the CPU would have been marked offline by the time the
CPU_POST_DEAD notifiers are executed.

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: Synchronize the cpufreq store_*() routines with CPU hotplug 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