linux/drivers/cpufreq
Rafael J. Wysocki 2a99859932 cpufreq: Fix cpufreq driver module refcount balance after suspend/resume
Since cpufreq_cpu_put() called by __cpufreq_remove_dev() drops the
driver module refcount, __cpufreq_remove_dev() causes that refcount
to become negative for the cpufreq driver after a suspend/resume
cycle.

This is not the only bad thing that happens there, however, because
kobject_put() should only be called for the policy kobject at this
point if the CPU is not the last one for that policy.

Namely, if the given CPU is the last one for that policy, the
policy kobject's refcount should be 1 at this point, as set by
cpufreq_add_dev_interface(), and only needs to be dropped once for
the kobject to go away.  This actually happens under the cpu == 1
check, so it need not be done before by cpufreq_cpu_put().

On the other hand, if the given CPU is not the last one for that
policy, this means that cpufreq_add_policy_cpu() has been called
at least once for that policy and cpufreq_cpu_get() has been
called for it too.  To balance that cpufreq_cpu_get(), we need to
call cpufreq_cpu_put() in that case.

Thus, to fix the described problem and keep the reference
counters balanced in both cases, move the cpufreq_cpu_get() call
in __cpufreq_remove_dev() to the code path executed only for
CPUs that share the policy with other CPUs.

Reported-and-tested-by: Toralf Förster <toralf.foerster@gmx.de>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Cc: 3.10+ <stable@vger.kernel.org>
2013-07-30 00:32:00 +02:00
..
acpi-cpufreq.c Merge branch 'pm-cpufreq' 2013-06-29 15:04:07 +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_dt: Instantiate as platform_driver 2013-05-22 12:43:33 +02: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: AVR32: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:25 +02:00
blackfin-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
cpufreq_conservative.c
cpufreq_governor.c cpufreq: Revert commit 2f7021a8 to fix CPU hotplug regression 2013-07-16 22:46:48 +02:00
cpufreq_governor.h cpufreq: Fix minor formatting issues 2013-06-21 01:06:34 +02:00
cpufreq_ondemand.c cpufreq: fix NULL pointer deference at od_set_powersave_bias() 2013-06-25 22:42:37 +02:00
cpufreq_performance.c cpufreq: Fix minor formatting issues 2013-06-21 01:06:34 +02:00
cpufreq_powersave.c cpufreq: Fix minor formatting issues 2013-06-21 01:06:34 +02:00
cpufreq_stats.c Power management and ACPI fixes for 3.11-rc2 2013-07-19 09:59:06 -07:00
cpufreq_userspace.c cpufreq: Fix minor formatting issues 2013-06-21 01:06:34 +02:00
cpufreq-cpu0.c cpufreq: cpufreq-cpu0: use the exact frequency for clk_set_rate() 2013-06-05 13:51:29 +02:00
cpufreq-nforce2.c cpufreq: drivers: Remove unnecessary assignments of policy-> members 2013-04-02 15:26:32 +02:00
cpufreq.c cpufreq: Fix cpufreq driver module refcount balance after suspend/resume 2013-07-30 00:32:00 +02:00
cris-artpec3-cpufreq.c cpufreq: cris: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:25 +02:00
cris-etraxfs-cpufreq.c cpufreq: cris: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:25 +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: e_powersaver: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 13:19:27 +02:00
elanfreq.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
exynos4x12-cpufreq.c
exynos4210-cpufreq.c
exynos5250-cpufreq.c
exynos5440-cpufreq.c cpufreq: exynos5440: Protect OPP search calls with RCU lock 2013-04-22 00:24:37 +02:00
exynos-cpufreq.c cpufreq: exynos: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 18:18:59 +05:30
exynos-cpufreq.h
freq_table.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
gx-suspmod.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
highbank-cpufreq.c
ia64-acpi-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
imx6q-cpufreq.c cpufreq: imx6q: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 18:19:00 +05:30
integrator-cpufreq.c cpufreq: integrator: move cpufreq driver to drivers/cpufreq 2013-04-08 13:02:31 +02:00
intel_pstate.c cpufreq / intel_pstate: Change to scale off of max P-state 2013-07-23 04:18:28 +02:00
Kconfig cpufreq: Fix incorrect dependecies for ARM SA11xx drivers 2013-05-12 14:04:16 +02:00
Kconfig.arm Power management and ACPI updates for 3.11-rc1 2013-07-03 14:35:40 -07:00
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 cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
longhaul.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
longhaul.h cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
longrun.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
loongson2_cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
Makefile Power management and ACPI updates for 3.11-rc1 2013-07-03 14:35:40 -07:00
maple-cpufreq.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
mperf.c
mperf.h
omap-cpufreq.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
p4-clockmod.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
pasemi-cpufreq.c cpufreq: powerpc: move cpufreq driver to drivers/cpufreq 2013-06-07 13:44:39 +02:00
pcc-cpufreq.c cpufreq: pcc: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 13:26:39 +02:00
pmac32-cpufreq.c cpufreq: powerpc: move cpufreq driver to drivers/cpufreq 2013-06-07 13:44:39 +02:00
pmac64-cpufreq.c cpufreq: powerpc: move cpufreq driver to drivers/cpufreq 2013-06-07 13:44:39 +02:00
powernow-k6.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
powernow-k7.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
powernow-k7.h
powernow-k8.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
powernow-k8.h
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: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +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: powerpc: Add cpufreq driver for Freescale e500mc SoCs 2013-06-05 14:19:28 +02:00
pxa2xx-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
pxa3xx-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +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: rename CONFIG_CPU_FREQ_S3C24XX_DEBUGFS 2013-07-15 01:31:37 +02:00
s3c64xx-cpufreq.c Merge branch 'pm-cpufreq-arm' into pm-cpufreq 2013-06-27 21:47:03 +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 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2013-07-04 11:40:58 -07: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: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
sh-cpufreq.c cpufreq: sh: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:25 +02:00
sparc-us2e-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
sparc-us3-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
spear-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
speedstep-centrino.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
speedstep-ich.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
speedstep-lib.c
speedstep-lib.h
speedstep-smi.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
tegra-cpufreq.c Merge branch 'pm-cpufreq-arm' into pm-cpufreq 2013-06-27 21:47:03 +02:00
unicore2-cpufreq.c cpufreq: unicore2: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:26 +02:00