x86/ACPI: keep x86_cpu_to_acpiid mapping valid on CPU hotplug
We may or may not have all possible CPUs in MADT on boot but in any case we're overwriting x86_cpu_to_acpiid mapping with U32_MAX when acpi_register_lapic() is called again on the CPU hotplug path: acpi_processor_hotadd_init() -> acpi_map_cpu() -> acpi_register_lapic() As we have the required acpi_id information in acpi_processor_hotadd_init() propagate it to acpi_map_cpu() to always keep x86_cpu_to_acpiid mapping valid. Reported-by: Andrew Jones <drjones@redhat.com> Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
d5adbfcd5f
commit
febf240741
|
@ -887,7 +887,8 @@ static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu)
|
|||
}
|
||||
|
||||
/* wrapper to silence section mismatch warning */
|
||||
int __ref acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu)
|
||||
int __ref acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
|
||||
int *pcpu)
|
||||
{
|
||||
return _acpi_map_lsapic(handle, physid, pcpu);
|
||||
}
|
||||
|
|
|
@ -723,11 +723,12 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu)
|
||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
|
||||
int *pcpu)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
cpu = acpi_register_lapic(physid, U32_MAX, ACPI_MADT_ENABLED);
|
||||
cpu = acpi_register_lapic(physid, acpi_id, ACPI_MADT_ENABLED);
|
||||
if (cpu < 0) {
|
||||
pr_info(PREFIX "Unable to map lapic to logical cpu number\n");
|
||||
return cpu;
|
||||
|
|
|
@ -165,7 +165,7 @@ static int acpi_processor_errata(void)
|
|||
|
||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||
int __weak acpi_map_cpu(acpi_handle handle,
|
||||
phys_cpuid_t physid, int *pcpu)
|
||||
phys_cpuid_t physid, u32 acpi_id, int *pcpu)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -203,7 +203,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr)
|
|||
cpu_maps_update_begin();
|
||||
cpu_hotplug_begin();
|
||||
|
||||
ret = acpi_map_cpu(pr->handle, pr->phys_id, &pr->id);
|
||||
ret = acpi_map_cpu(pr->handle, pr->phys_id, pr->acpi_id, &pr->id);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
|
|
|
@ -291,7 +291,8 @@ bool acpi_processor_validate_proc_id(int proc_id);
|
|||
|
||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||
/* Arch dependent functions for cpu hotplug support */
|
||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu);
|
||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
|
||||
int *pcpu);
|
||||
int acpi_unmap_cpu(int cpu);
|
||||
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid);
|
||||
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
|
||||
|
|
Loading…
Reference in New Issue