acpi: pdc init related memory leak with physical CPU hotplug
Subsystems (3)
PATCH 1/1 acpi: pdc init related memory leak with physical CPU hotplug
arch_acpi_processor_cleanup_pdc() in x86 and ia64 results in memory allocated for _PDC objects that is never freed and will cause memory leak in case of physical CPU remove and add. Patch fixes the memory leak by freeing the objects soon after _PDC is evaluated.
Reported-by Bjorn Helgaas <[email protected]>
Signed-off-by Venkatesh Pallipadi <[email protected]>
--- arch/ia64/kernel/acpi-processor.c | 12 ++++++++++++ arch/x86/kernel/acpi/processor.c | 13 +++++++++++++ drivers/acpi/processor_core.c | 2 ++ include/acpi/processor.h | 1 + 4 files changed, 28 insertions(+), 0 deletions(-)
arch/ia64/kernel/acpi-processor.c +12 -0
@@ -71,3 +71,15 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr) }EXPORT_SYMBOL (arch_acpi_processor_init_pdc); + +void arch_acpi_processor_cleanup_pdc (struct acpi_processor *pr) +{ +if (pr->pdc) { +kfree (pr->pdc->pointer->buffer.pointer); +kfree (pr->pdc->pointer); +kfree (pr->pdc); + pr->pdc =NULL ; + } +} + +EXPORT_SYMBOL (arch_acpi_processor_cleanup_pdc);
arch/x86/kernel/acpi/processor.c +13 -0
@@ -72,6 +72,7 @@ static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)return ; } +/* Initialize _PDC data based on the CPU vendor */ void arch_acpi_processor_init_pdc (struct acpi_processor *pr) {
@@ -85,3 +86,15 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr) }EXPORT_SYMBOL (arch_acpi_processor_init_pdc); + +void arch_acpi_processor_cleanup_pdc (struct acpi_processor *pr) +{ +if (pr->pdc) { +kfree (pr->pdc->pointer->buffer.pointer); +kfree (pr->pdc->pointer); +kfree (pr->pdc); + pr->pdc =NULL ; + } +} + +EXPORT_SYMBOL (arch_acpi_processor_cleanup_pdc);
drivers/acpi/processor_core.c +2 -0
@@ -731,6 +731,8 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)/* _PDC call should be done before doing anything else (if reqd.). */ arch_acpi_processor_init_pdc (pr);acpi_processor_set_pdc (pr); +arch_acpi_processor_cleanup_pdc (pr); +#ifdef CONFIG_CPU_FREQ acpi_processor_ppc_has_changed (pr);#endif
include/acpi/processor.h +1 -0
@@ -258,6 +258,7 @@ DECLARE_PER_CPU(struct acpi_processor *, processors);extern struct acpi_processor_errata errata;void arch_acpi_processor_init_pdc (struct acpi_processor *pr); +void arch_acpi_processor_cleanup_pdc (struct acpi_processor *pr);#ifdef ARCH_HAS_POWER_INIT void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags,
Signature · 1 line
1.6.0.6
Len Brown
reviewerapplied to acpi-test
thanks,
Len Brown, Intel Open Source Technology Center