diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-12-13 21:15:58 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-12-13 21:15:58 -0500 |
commit | cc31e9b718dafd8a1bdc593234ddbbf4faa2511c (patch) | |
tree | 36b8c35ad5bbf07e4b4e6e7619f03f71d02dbe37 | |
parent | a67485d4bf97918225dfb5246e531643755a7ee1 (diff) | |
parent | 28076483afac9dd77df269f5d460e51a09dfb19f (diff) |
Merge branch 'acpi-cppc'
* acpi-cppc:
ACPI / CPPC: Fix per-CPU pointer management in acpi_cppc_processor_probe()
ACPI / CPPC: Fix crash in acpi_cppc_processor_exit()
-rw-r--r-- | drivers/acpi/cppc_acpi.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index e0ea8f56d2bf..3ca0729f7e0e 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c | |||
@@ -776,9 +776,6 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) | |||
776 | init_waitqueue_head(&pcc_data.pcc_write_wait_q); | 776 | init_waitqueue_head(&pcc_data.pcc_write_wait_q); |
777 | } | 777 | } |
778 | 778 | ||
779 | /* Plug PSD data into this CPUs CPC descriptor. */ | ||
780 | per_cpu(cpc_desc_ptr, pr->id) = cpc_ptr; | ||
781 | |||
782 | /* Everything looks okay */ | 779 | /* Everything looks okay */ |
783 | pr_debug("Parsed CPC struct for CPU: %d\n", pr->id); | 780 | pr_debug("Parsed CPC struct for CPU: %d\n", pr->id); |
784 | 781 | ||
@@ -789,10 +786,15 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) | |||
789 | goto out_free; | 786 | goto out_free; |
790 | } | 787 | } |
791 | 788 | ||
789 | /* Plug PSD data into this CPUs CPC descriptor. */ | ||
790 | per_cpu(cpc_desc_ptr, pr->id) = cpc_ptr; | ||
791 | |||
792 | ret = kobject_init_and_add(&cpc_ptr->kobj, &cppc_ktype, &cpu_dev->kobj, | 792 | ret = kobject_init_and_add(&cpc_ptr->kobj, &cppc_ktype, &cpu_dev->kobj, |
793 | "acpi_cppc"); | 793 | "acpi_cppc"); |
794 | if (ret) | 794 | if (ret) { |
795 | per_cpu(cpc_desc_ptr, pr->id) = NULL; | ||
795 | goto out_free; | 796 | goto out_free; |
797 | } | ||
796 | 798 | ||
797 | kfree(output.pointer); | 799 | kfree(output.pointer); |
798 | return 0; | 800 | return 0; |
@@ -826,6 +828,8 @@ void acpi_cppc_processor_exit(struct acpi_processor *pr) | |||
826 | void __iomem *addr; | 828 | void __iomem *addr; |
827 | 829 | ||
828 | cpc_ptr = per_cpu(cpc_desc_ptr, pr->id); | 830 | cpc_ptr = per_cpu(cpc_desc_ptr, pr->id); |
831 | if (!cpc_ptr) | ||
832 | return; | ||
829 | 833 | ||
830 | /* Free all the mapped sys mem areas for this CPU */ | 834 | /* Free all the mapped sys mem areas for this CPU */ |
831 | for (i = 2; i < cpc_ptr->num_entries; i++) { | 835 | for (i = 2; i < cpc_ptr->num_entries; i++) { |