| From cff9ab2b291e64259d97add48fe073c081afe4e2 Mon Sep 17 00:00:00 2001 |
| From: Denys Vlasenko <dvlasenk@redhat.com> |
| Date: Tue, 13 Sep 2016 20:12:32 +0200 |
| Subject: x86/apic: Get rid of apic_version[] array |
| |
| From: Denys Vlasenko <dvlasenk@redhat.com> |
| |
| commit cff9ab2b291e64259d97add48fe073c081afe4e2 upstream. |
| |
| The array has a size of MAX_LOCAL_APIC, which can be as large as 32k, so it |
| can consume up to 128k. |
| |
| The array has been there forever and was never used for anything useful |
| other than a version mismatch check which was introduced in 2009. |
| |
| There is no reason to store the version in an array. The kernel is not |
| prepared to handle different APIC versions anyway, so the real important |
| part is to detect a version mismatch and warn about it, which can be done |
| with a single variable as well. |
| |
| [ tglx: Massaged changelog ] |
| |
| Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com> |
| CC: Andy Lutomirski <luto@amacapital.net> |
| CC: Borislav Petkov <bp@alien8.de> |
| CC: Brian Gerst <brgerst@gmail.com> |
| CC: Mike Travis <travis@sgi.com> |
| Link: http://lkml.kernel.org/r/20160913181232.30815-1-dvlasenk@redhat.com |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/include/asm/mpspec.h | 2 +- |
| arch/x86/kernel/acpi/boot.c | 2 +- |
| arch/x86/kernel/apic/apic.c | 17 +++++++---------- |
| arch/x86/kernel/apic/io_apic.c | 4 ++-- |
| arch/x86/kernel/apic/probe_32.c | 2 +- |
| arch/x86/kernel/smpboot.c | 10 +++++----- |
| 6 files changed, 17 insertions(+), 20 deletions(-) |
| |
| --- a/arch/x86/include/asm/mpspec.h |
| +++ b/arch/x86/include/asm/mpspec.h |
| @@ -6,7 +6,6 @@ |
| #include <asm/x86_init.h> |
| #include <asm/apicdef.h> |
| |
| -extern int apic_version[]; |
| extern int pic_mode; |
| |
| #ifdef CONFIG_X86_32 |
| @@ -40,6 +39,7 @@ extern int mp_bus_id_to_type[MAX_MP_BUSS |
| extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); |
| |
| extern unsigned int boot_cpu_physical_apicid; |
| +extern u8 boot_cpu_apic_version; |
| extern unsigned long mp_lapic_addr; |
| |
| #ifdef CONFIG_X86_LOCAL_APIC |
| --- a/arch/x86/kernel/acpi/boot.c |
| +++ b/arch/x86/kernel/acpi/boot.c |
| @@ -180,7 +180,7 @@ static int acpi_register_lapic(int id, u |
| } |
| |
| if (boot_cpu_physical_apicid != -1U) |
| - ver = apic_version[boot_cpu_physical_apicid]; |
| + ver = boot_cpu_apic_version; |
| |
| return generic_processor_info(id, ver); |
| } |
| --- a/arch/x86/kernel/apic/apic.c |
| +++ b/arch/x86/kernel/apic/apic.c |
| @@ -64,6 +64,8 @@ unsigned disabled_cpus; |
| unsigned int boot_cpu_physical_apicid = -1U; |
| EXPORT_SYMBOL_GPL(boot_cpu_physical_apicid); |
| |
| +u8 boot_cpu_apic_version; |
| + |
| /* |
| * The highest APIC ID seen during enumeration. |
| */ |
| @@ -1790,8 +1792,7 @@ void __init init_apic_mappings(void) |
| * since smp_sanity_check is prepared for such a case |
| * and disable smp mode |
| */ |
| - apic_version[new_apicid] = |
| - GET_APIC_VERSION(apic_read(APIC_LVR)); |
| + boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR)); |
| } |
| } |
| |
| @@ -1806,13 +1807,10 @@ void __init register_lapic_address(unsig |
| } |
| if (boot_cpu_physical_apicid == -1U) { |
| boot_cpu_physical_apicid = read_apic_id(); |
| - apic_version[boot_cpu_physical_apicid] = |
| - GET_APIC_VERSION(apic_read(APIC_LVR)); |
| + boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR)); |
| } |
| } |
| |
| -int apic_version[MAX_LOCAL_APIC]; |
| - |
| /* |
| * Local APIC interrupts |
| */ |
| @@ -2102,11 +2100,10 @@ int generic_processor_info(int apicid, i |
| cpu, apicid); |
| version = 0x10; |
| } |
| - apic_version[apicid] = version; |
| |
| - if (version != apic_version[boot_cpu_physical_apicid]) { |
| + if (version != boot_cpu_apic_version) { |
| pr_warning("BIOS bug: APIC version mismatch, boot CPU: %x, CPU %d: version %x\n", |
| - apic_version[boot_cpu_physical_apicid], cpu, version); |
| + boot_cpu_apic_version, cpu, version); |
| } |
| |
| physid_set(apicid, phys_cpu_present_map); |
| @@ -2249,7 +2246,7 @@ int __init APIC_init_uniprocessor(void) |
| * Complain if the BIOS pretends there is one. |
| */ |
| if (!boot_cpu_has(X86_FEATURE_APIC) && |
| - APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) { |
| + APIC_INTEGRATED(boot_cpu_apic_version)) { |
| pr_err("BIOS bug, local APIC 0x%x not detected!...\n", |
| boot_cpu_physical_apicid); |
| return -1; |
| --- a/arch/x86/kernel/apic/io_apic.c |
| +++ b/arch/x86/kernel/apic/io_apic.c |
| @@ -1592,7 +1592,7 @@ void __init setup_ioapic_ids_from_mpc(vo |
| * no meaning without the serial APIC bus. |
| */ |
| if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) |
| - || APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) |
| + || APIC_XAPIC(boot_cpu_apic_version)) |
| return; |
| setup_ioapic_ids_from_mpc_nocheck(); |
| } |
| @@ -2422,7 +2422,7 @@ static int io_apic_get_unique_id(int ioa |
| static u8 io_apic_unique_id(int idx, u8 id) |
| { |
| if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && |
| - !APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) |
| + !APIC_XAPIC(boot_cpu_apic_version)) |
| return io_apic_get_unique_id(idx, id); |
| else |
| return id; |
| --- a/arch/x86/kernel/apic/probe_32.c |
| +++ b/arch/x86/kernel/apic/probe_32.c |
| @@ -153,7 +153,7 @@ early_param("apic", parse_apic); |
| |
| void __init default_setup_apic_routing(void) |
| { |
| - int version = apic_version[boot_cpu_physical_apicid]; |
| + int version = boot_cpu_apic_version; |
| |
| if (num_possible_cpus() > 8) { |
| switch (boot_cpu_data.x86_vendor) { |
| --- a/arch/x86/kernel/smpboot.c |
| +++ b/arch/x86/kernel/smpboot.c |
| @@ -676,7 +676,7 @@ wakeup_secondary_cpu_via_nmi(int apicid, |
| * Give the other CPU some time to accept the IPI. |
| */ |
| udelay(200); |
| - if (APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) { |
| + if (APIC_INTEGRATED(boot_cpu_apic_version)) { |
| maxlvt = lapic_get_maxlvt(); |
| if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */ |
| apic_write(APIC_ESR, 0); |
| @@ -703,7 +703,7 @@ wakeup_secondary_cpu_via_init(int phys_a |
| /* |
| * Be paranoid about clearing APIC errors. |
| */ |
| - if (APIC_INTEGRATED(apic_version[phys_apicid])) { |
| + if (APIC_INTEGRATED(boot_cpu_apic_version)) { |
| if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */ |
| apic_write(APIC_ESR, 0); |
| apic_read(APIC_ESR); |
| @@ -742,7 +742,7 @@ wakeup_secondary_cpu_via_init(int phys_a |
| * Determine this based on the APIC version. |
| * If we don't have an integrated APIC, don't send the STARTUP IPIs. |
| */ |
| - if (APIC_INTEGRATED(apic_version[phys_apicid])) |
| + if (APIC_INTEGRATED(boot_cpu_apic_version)) |
| num_starts = 2; |
| else |
| num_starts = 0; |
| @@ -980,7 +980,7 @@ static int do_boot_cpu(int apicid, int c |
| /* |
| * Be paranoid about clearing APIC errors. |
| */ |
| - if (APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) { |
| + if (APIC_INTEGRATED(boot_cpu_apic_version)) { |
| apic_write(APIC_ESR, 0); |
| apic_read(APIC_ESR); |
| } |
| @@ -1235,7 +1235,7 @@ static int __init smp_sanity_check(unsig |
| /* |
| * If we couldn't find a local APIC, then get out of here now! |
| */ |
| - if (APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid]) && |
| + if (APIC_INTEGRATED(boot_cpu_apic_version) && |
| !boot_cpu_has(X86_FEATURE_APIC)) { |
| if (!disable_apic) { |
| pr_err("BIOS bug, local APIC #%d not detected!...\n", |