Messages in this thread |  | | | Date | Sat, 9 Jan 2010 14:51:26 -0800 | | Subject | Re: [PATCH] Make Intel 8-way Xeons boot again | | From | Yinghai Lu <> |
| |
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/
|  |