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 */
|
/* 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);
|
return _acpi_map_lsapic(handle, physid, pcpu);
|
||||||
}
|
}
|
||||||
|
@ -723,11 +723,12 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
|||||||
return 0;
|
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;
|
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) {
|
if (cpu < 0) {
|
||||||
pr_info(PREFIX "Unable to map lapic to logical cpu number\n");
|
pr_info(PREFIX "Unable to map lapic to logical cpu number\n");
|
||||||
return cpu;
|
return cpu;
|
||||||
|
@ -165,7 +165,7 @@ static int acpi_processor_errata(void)
|
|||||||
|
|
||||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||||
int __weak acpi_map_cpu(acpi_handle handle,
|
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;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
@ -203,7 +203,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr)
|
|||||||
cpu_maps_update_begin();
|
cpu_maps_update_begin();
|
||||||
cpu_hotplug_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)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -291,7 +291,8 @@ bool acpi_processor_validate_proc_id(int proc_id);
|
|||||||
|
|
||||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||||
/* Arch dependent functions for cpu hotplug support */
|
/* 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_unmap_cpu(int cpu);
|
||||||
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid);
|
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid);
|
||||||
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
|
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
|
||||||
|
Loading…
Reference in New Issue
Block a user