lkml.org 
[lkml]   [2010]   [Mar]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[028/116] x86, apic: Dont use logical-flat mode when CPU hotplug may exceed 8 CPUs
    2.6.32-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Suresh Siddha <suresh.b.siddha@intel.com>

    commit 681ee44d40d7c93b42118320e4620d07d8704fd6 upstream

    We need to fall back from logical-flat APIC mode to physical-flat mode
    when we have more than 8 CPUs. However, in the presence of CPU
    hotplug(with bios listing not enabled but possible cpus as disabled cpus in
    MADT), we have to consider the number of possible CPUs rather than
    the number of current CPUs; otherwise we may cross the 8-CPU boundary
    when CPUs are added later.

    32bit apic code can use more cleanups (like the removal of vendor checks in
    32bit default_setup_apic_routing()) and more unifications with 64bit code.
    Yinghai has some patches in works already. This patch addresses the boot issue
    that is reported in the virtualization guest context.

    Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
    Acked-by: Shaohui Zheng <shaohui.zheng@intel.com>
    Reviewed-by: Yinghai Lu <yinghai@kernel.org>
    Signed-off-by: H. Peter Anvin <hpa@zytor.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/kernel/acpi/boot.c | 5 -----
    arch/x86/kernel/apic/apic.c | 14 --------------
    arch/x86/kernel/apic/probe_32.c | 27 ++++++++++++++++++++++++++-
    arch/x86/kernel/apic/probe_64.c | 13 ++-----------
    arch/x86/kernel/mpparse.c | 7 -------
    arch/x86/kernel/smpboot.c | 2 --
    6 files changed, 28 insertions(+), 40 deletions(-)

    --- a/arch/x86/kernel/acpi/boot.c
    +++ b/arch/x86/kernel/acpi/boot.c
    @@ -1191,9 +1191,6 @@ static void __init acpi_process_madt(voi
    if (!error) {
    acpi_lapic = 1;

    -#ifdef CONFIG_X86_BIGSMP
    - generic_bigsmp_probe();
    -#endif
    /*
    * Parse MADT IO-APIC entries
    */
    @@ -1203,8 +1200,6 @@ static void __init acpi_process_madt(voi
    acpi_ioapic = 1;

    smp_found_config = 1;
    - if (apic->setup_apic_routing)
    - apic->setup_apic_routing();
    }
    }
    if (error == -EINVAL) {
    --- a/arch/x86/kernel/apic/apic.c
    +++ b/arch/x86/kernel/apic/apic.c
    @@ -1665,9 +1665,7 @@ int __init APIC_init_uniprocessor(void)
    #endif

    enable_IR_x2apic();
    -#ifdef CONFIG_X86_64
    default_setup_apic_routing();
    -#endif

    verify_local_APIC();
    connect_bsp_APIC();
    @@ -1915,18 +1913,6 @@ void __cpuinit generic_processor_info(in
    if (apicid > max_physical_apicid)
    max_physical_apicid = apicid;

    -#ifdef CONFIG_X86_32
    - switch (boot_cpu_data.x86_vendor) {
    - case X86_VENDOR_INTEL:
    - if (num_processors > 8)
    - def_to_bigsmp = 1;
    - break;
    - case X86_VENDOR_AMD:
    - if (max_physical_apicid >= 8)
    - def_to_bigsmp = 1;
    - }
    -#endif
    -
    #if defined(CONFIG_SMP) || defined(CONFIG_X86_64)
    early_per_cpu(x86_cpu_to_apicid, cpu) = apicid;
    early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid;
    --- a/arch/x86/kernel/apic/probe_32.c
    +++ b/arch/x86/kernel/apic/probe_32.c
    @@ -54,6 +54,31 @@ late_initcall(print_ipi_mode);

    void default_setup_apic_routing(void)
    {
    + int version = apic_version[boot_cpu_physical_apicid];
    +
    + if (num_possible_cpus() > 8) {
    + switch (boot_cpu_data.x86_vendor) {
    + case X86_VENDOR_INTEL:
    + if (!APIC_XAPIC(version)) {
    + def_to_bigsmp = 0;
    + break;
    + }
    + /* If P4 and above fall through */
    + case X86_VENDOR_AMD:
    + def_to_bigsmp = 1;
    + }
    + }
    +
    +#ifdef CONFIG_X86_BIGSMP
    + generic_bigsmp_probe();
    +#endif
    +
    + if (apic->setup_apic_routing)
    + apic->setup_apic_routing();
    +}
    +
    +void setup_apic_flat_routing(void)
    +{
    #ifdef CONFIG_X86_IO_APIC
    printk(KERN_INFO
    "Enabling APIC mode: Flat. Using %d I/O APICs\n",
    @@ -103,7 +128,7 @@ struct apic apic_default = {
    .init_apic_ldr = default_init_apic_ldr,

    .ioapic_phys_id_map = default_ioapic_phys_id_map,
    - .setup_apic_routing = default_setup_apic_routing,
    + .setup_apic_routing = setup_apic_flat_routing,
    .multi_timer_check = NULL,
    .apicid_to_node = default_apicid_to_node,
    .cpu_to_logical_apicid = default_cpu_to_logical_apicid,
    --- a/arch/x86/kernel/apic/probe_64.c
    +++ b/arch/x86/kernel/apic/probe_64.c
    @@ -67,17 +67,8 @@ void __init default_setup_apic_routing(v
    }
    #endif

    - if (apic == &apic_flat) {
    - switch (boot_cpu_data.x86_vendor) {
    - case X86_VENDOR_INTEL:
    - if (num_processors > 8)
    - apic = &apic_physflat;
    - break;
    - case X86_VENDOR_AMD:
    - if (max_physical_apicid >= 8)
    - apic = &apic_physflat;
    - }
    - }
    + if (apic == &apic_flat && num_possible_cpus() > 8)
    + apic = &apic_physflat;

    printk(KERN_INFO "Setting APIC routing to %s\n", apic->name);

    --- a/arch/x86/kernel/mpparse.c
    +++ b/arch/x86/kernel/mpparse.c
    @@ -359,13 +359,6 @@ static int __init smp_read_mpc(struct mp
    x86_init.mpparse.mpc_record(1);
    }

    -#ifdef CONFIG_X86_BIGSMP
    - generic_bigsmp_probe();
    -#endif
    -
    - if (apic->setup_apic_routing)
    - apic->setup_apic_routing();
    -
    if (!num_processors)
    printk(KERN_ERR "MPTABLE: no processors registered!\n");
    return num_processors;
    --- a/arch/x86/kernel/smpboot.c
    +++ b/arch/x86/kernel/smpboot.c
    @@ -1066,9 +1066,7 @@ void __init native_smp_prepare_cpus(unsi
    set_cpu_sibling_map(0);

    enable_IR_x2apic();
    -#ifdef CONFIG_X86_64
    default_setup_apic_routing();
    -#endif

    if (smp_sanity_check(max_cpus) < 0) {
    printk(KERN_INFO "SMP disabled\n");



    \
     
     \ /
      Last update: 2010-03-31 02:15    [W:0.030 / U:90.084 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site