lkml.org 
[lkml]   [2010]   [Jan]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH] Make Intel 8-way Xeons boot again
    From
    On Sat, Jan 9, 2010 at 10:11 AM, Linus Torvalds
    <torvalds@linux-foundation.org> wrote:
    >
    >
    > On Sat, 9 Jan 2010, Ananth N Mavinakayanahalli wrote:
    >>
    >> On an 8-way system with Intel Xeon X7350 CPUs, booting 2.6.32 or newer
    >> kernels fails at:
    >>
    >> ...
    >> CPU0: Intel(R) Xeon(R) CPU           X7350  @ 2.93GHz stepping 0b
    >> Booting Node   0, Processors  #1 #2 #3 #4 #5 #6 #7 Ok.
    >> Brought up 8 CPUs
    >> Total of 8 processors activated (46906.05 BogoMIPS).
    >>
    >> Git bisect showed 2fbd07a5f as the offending commit.
    >
    > Ok, that commit definitely is buggy.
    >
    >> With the patch below, I am able to boot the latest Linus' git tree on
    >> the machine. If this patch is correct, it needs to get into the stable
    >> tree too.
    >
    > I don't think the patch is correct, though. The thing is, the AMD check
    > seems to be the correct one: you can only use 'apic_flat' if all the APIC
    > ID's are < 8.
    >
    > It doesn't matter _how_ many CPU's you have. If you have two CPU's, but
    > one of them has an APIC ID >= 8, then you cannot use the flat APIC model,
    > since it depends on a 8-bit bitfield.
    >
    > So your patch doesn't seem right either, because it still tests
    > num_processors, which is bogus.
    >
    > In fact, I can't for the life of me understand why it treats different
    > vendors differently. Why is that code not just a simple
    >
    >        /* Flat apic mode requires that all APIC ID's are in the range 0..7 */
    >        if (apic == &apic_flat && max_physical_apicid >= 8)
    >                apic = &apic_physflat;
    >
    > instead, with no crazy vendor tests.
    >
    > What am I missing?

    according to Suresh, intel CPUs could use logical flat mode when total
    num_cpus <=8 even some cpu's physical apicid > 0.

    and init_apic_ldr should set ldr to the cpu to map cpu index to the cpu.

    static void flat_init_apic_ldr(void)
    {
    unsigned long val;
    unsigned long num, id;

    num = smp_processor_id();
    id = 1UL << num;
    apic_write(APIC_DFR, APIC_DFR_FLAT);
    val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
    val |= SET_APIC_LOGICAL_ID(id);
    apic_write(APIC_LDR, val);
    }

    in Ananth's case, APs are started, so LDR should be set correctly.

    YH
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2010-01-09 23:53    [W:0.052 / U:0.272 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site