diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-26 17:23:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-26 17:23:35 -0400 |
commit | 64b1cbaa1068f38994230df2aa0fee7033008399 (patch) | |
tree | 287d08359f68a00af62bdb68c786fa397a0b5575 /drivers | |
parent | f54c77dd9953241be8b63f9239facdde82b3eb18 (diff) | |
parent | 879dca019dc43a1622edca3e7dde644b14b5acc5 (diff) |
Merge tag 'pm+acpi-for-3.7-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management and ACPI fixes from Rafael J Wysocki:
- Fix for a memory leak in acpi_bind_one() from Jesper Juhl.
- Fix for an error code path memory leak in pm_genpd_attach_cpuidle()
from Jonghwan Choi.
- Fix for smp_processor_id() usage in preemptible code in powernow-k8
from Andreas Herrmann.
- Fix for a suspend-related memory leak in cpufreq stats from Xiaobing
Tu.
- Freezer fix for failure to clear PF_NOFREEZE along with PF_KTHREAD in
flush_old_exec() from Oleg Nesterov.
- acpi_processor_notify() fix from Alan Cox.
* tag 'pm+acpi-for-3.7-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
ACPI: missing break
freezer: exec should clear PF_NOFREEZE along with PF_KTHREAD
Fix memory leak in cpufreq stats.
cpufreq / powernow-k8: Remove usage of smp_processor_id() in preemptible code
PM / Domains: Fix memory leak on error path in pm_genpd_attach_cpuidle
ACPI: Fix memory leak in acpi_bind_one()
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/acpi/glue.c | 1 | ||||
-rw-r--r-- | drivers/acpi/processor_driver.c | 1 | ||||
-rw-r--r-- | drivers/base/power/domain.c | 5 | ||||
-rw-r--r-- | drivers/cpufreq/cpufreq_stats.c | 1 | ||||
-rw-r--r-- | drivers/cpufreq/powernow-k8.c | 9 |
5 files changed, 8 insertions, 9 deletions
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index d1a2d74033e9..08373086cd7e 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
@@ -159,6 +159,7 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
159 | if (physical_node->node_id >= ACPI_MAX_PHYSICAL_NODE) { | 159 | if (physical_node->node_id >= ACPI_MAX_PHYSICAL_NODE) { |
160 | retval = -ENOSPC; | 160 | retval = -ENOSPC; |
161 | mutex_unlock(&acpi_dev->physical_node_lock); | 161 | mutex_unlock(&acpi_dev->physical_node_lock); |
162 | kfree(physical_node); | ||
162 | goto err; | 163 | goto err; |
163 | } | 164 | } |
164 | 165 | ||
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index e78c2a52ea46..bd4e5dca3ff7 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
@@ -409,6 +409,7 @@ static void acpi_processor_notify(struct acpi_device *device, u32 event) | |||
409 | acpi_bus_generate_proc_event(device, event, 0); | 409 | acpi_bus_generate_proc_event(device, event, 0); |
410 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 410 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
411 | dev_name(&device->dev), event, 0); | 411 | dev_name(&device->dev), event, 0); |
412 | break; | ||
412 | default: | 413 | default: |
413 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 414 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
414 | "Unsupported event [0x%x]\n", event)); | 415 | "Unsupported event [0x%x]\n", event)); |
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index c22b869245d9..96b71b6536d6 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
@@ -1862,7 +1862,7 @@ int pm_genpd_attach_cpuidle(struct generic_pm_domain *genpd, int state) | |||
1862 | cpuidle_drv = cpuidle_driver_ref(); | 1862 | cpuidle_drv = cpuidle_driver_ref(); |
1863 | if (!cpuidle_drv) { | 1863 | if (!cpuidle_drv) { |
1864 | ret = -ENODEV; | 1864 | ret = -ENODEV; |
1865 | goto out; | 1865 | goto err_drv; |
1866 | } | 1866 | } |
1867 | if (cpuidle_drv->state_count <= state) { | 1867 | if (cpuidle_drv->state_count <= state) { |
1868 | ret = -EINVAL; | 1868 | ret = -EINVAL; |
@@ -1884,6 +1884,9 @@ int pm_genpd_attach_cpuidle(struct generic_pm_domain *genpd, int state) | |||
1884 | 1884 | ||
1885 | err: | 1885 | err: |
1886 | cpuidle_driver_unref(); | 1886 | cpuidle_driver_unref(); |
1887 | |||
1888 | err_drv: | ||
1889 | kfree(cpu_data); | ||
1887 | goto out; | 1890 | goto out; |
1888 | } | 1891 | } |
1889 | 1892 | ||
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index b40ee1403be9..399831690fed 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c | |||
@@ -328,6 +328,7 @@ static int __cpuinit cpufreq_stat_cpu_callback(struct notifier_block *nfb, | |||
328 | cpufreq_update_policy(cpu); | 328 | cpufreq_update_policy(cpu); |
329 | break; | 329 | break; |
330 | case CPU_DOWN_PREPARE: | 330 | case CPU_DOWN_PREPARE: |
331 | case CPU_DOWN_PREPARE_FROZEN: | ||
331 | cpufreq_stats_free_sysfs(cpu); | 332 | cpufreq_stats_free_sysfs(cpu); |
332 | break; | 333 | break; |
333 | case CPU_DEAD: | 334 | case CPU_DEAD: |
diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c index 129e80bfff22..c16a3a593ba4 100644 --- a/drivers/cpufreq/powernow-k8.c +++ b/drivers/cpufreq/powernow-k8.c | |||
@@ -1052,14 +1052,7 @@ static int powernowk8_target(struct cpufreq_policy *pol, | |||
1052 | struct powernowk8_target_arg pta = { .pol = pol, .targfreq = targfreq, | 1052 | struct powernowk8_target_arg pta = { .pol = pol, .targfreq = targfreq, |
1053 | .relation = relation }; | 1053 | .relation = relation }; |
1054 | 1054 | ||
1055 | /* | 1055 | return work_on_cpu(pol->cpu, powernowk8_target_fn, &pta); |
1056 | * Must run on @pol->cpu. cpufreq core is responsible for ensuring | ||
1057 | * that we're bound to the current CPU and pol->cpu stays online. | ||
1058 | */ | ||
1059 | if (smp_processor_id() == pol->cpu) | ||
1060 | return powernowk8_target_fn(&pta); | ||
1061 | else | ||
1062 | return work_on_cpu(pol->cpu, powernowk8_target_fn, &pta); | ||
1063 | } | 1056 | } |
1064 | 1057 | ||
1065 | /* Driver entry point to verify the policy and range of frequencies */ | 1058 | /* Driver entry point to verify the policy and range of frequencies */ |