aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-12-13 21:15:58 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-12-13 21:15:58 -0500
commitcc31e9b718dafd8a1bdc593234ddbbf4faa2511c (patch)
tree36b8c35ad5bbf07e4b4e6e7619f03f71d02dbe37
parenta67485d4bf97918225dfb5246e531643755a7ee1 (diff)
parent28076483afac9dd77df269f5d460e51a09dfb19f (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.c12
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++) {