lkml.org 
[lkml]   [2009]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/urgent] x86, apic: Fix missed handling of discrete apics
    Commit-ID:  8312136fa8b0a3ec7323bbb1a46be8c0c26e994e
    Gitweb: http://git.kernel.org/tip/8312136fa8b0a3ec7323bbb1a46be8c0c26e994e
    Author: Cyrill Gorcunov <gorcunov@openvz.org>
    AuthorDate: Tue, 15 Sep 2009 11:12:30 +0400
    Committer: Ingo Molnar <mingo@elte.hu>
    CommitDate: Sun, 20 Sep 2009 20:18:07 +0200

    x86, apic: Fix missed handling of discrete apics

    In case of discrete (pretty old) apics we may have cpu_has_apic bit
    not set but have to check if smp_found_config (MP spec) is there
    and apic was not disabled.

    Also don't forget to print apic/io-apic for such case as well.

    Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
    Cc: "Maciej W. Rozycki" <macro@linux-mips.org>
    Cc: Yinghai Lu <yinghai@kernel.org>
    LKML-Reference: <20090915071230.GA10604@lenovo>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>


    ---
    arch/x86/include/asm/apic.h | 13 +++++++++++++
    arch/x86/kernel/apic/apic.c | 2 +-
    arch/x86/kernel/apic/io_apic.c | 4 ++--
    3 files changed, 16 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
    index 586b7ad..9a86fb4 100644
    --- a/arch/x86/include/asm/apic.h
    +++ b/arch/x86/include/asm/apic.h
    @@ -66,6 +66,19 @@ static inline void default_inquire_remote_apic(int apicid)
    }

    /*
    + * With 82489DX we can't rely on apic feature bit
    + * retrieved via cpuid but still have to deal with
    + * such an apic chip so we assume that SMP configuration
    + * is found from MP table (64bit case uses ACPI mostly
    + * which set smp presence flag as well so we are safe
    + * to use this helper too).
    + */
    +static inline bool apic_from_smp_config(void)
    +{
    + return smp_found_config && !disable_apic;
    +}
    +
    +/*
    * Basic functions accessing APICs.
    */
    #ifdef CONFIG_PARAVIRT
    diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
    index 072aea6..2d59dfa 100644
    --- a/arch/x86/kernel/apic/apic.c
    +++ b/arch/x86/kernel/apic/apic.c
    @@ -978,7 +978,7 @@ void lapic_shutdown(void)
    {
    unsigned long flags;

    - if (!cpu_has_apic)
    + if (!cpu_has_apic && !apic_from_smp_config())
    return;

    local_irq_save(flags);
    diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
    index 3c8f9e7..593c4f8 100644
    --- a/arch/x86/kernel/apic/io_apic.c
    +++ b/arch/x86/kernel/apic/io_apic.c
    @@ -1863,7 +1863,7 @@ __apicdebuginit(int) print_all_ICs(void)
    print_PIC();

    /* don't print out if apic is not there */
    - if (!cpu_has_apic || disable_apic)
    + if (!cpu_has_apic && !apic_from_smp_config())
    return 0;

    print_all_local_APICs();
    @@ -1981,7 +1981,7 @@ void disable_IO_APIC(void)
    /*
    * Use virtual wire A mode when interrupt remapping is enabled.
    */
    - if (cpu_has_apic)
    + if (cpu_has_apic || apic_from_smp_config())
    disconnect_bsp_APIC(!intr_remapping_enabled &&
    ioapic_i8259.pin != -1);
    }

    \
     
     \ /
      Last update: 2009-09-20 20:31    [W:0.028 / U:1.760 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site