From: Zou Nan hai in 2.6.24-rc1 kernel, The /proc/cpuinfo display is wrong. Another issue is that it will display bogus cpus with wrong information if the kernel is compiled with a big CONFIG_NR_CPU. That is because before a cpu in cpu_present_map is up, c->cpu_index of that cpu is 0. thus the cpu_online(c->cpu_index) check in show_cpuinfo is invalid. This patch will let cpuinfo_op use cpu_online_map instead of cpu_present_map to iterate cpus. Signed-off-by: Zou Nan hai Cc: Thomas Gleixner Cc: Ingo Molnar Signed-off-by: Andrew Morton --- arch/x86/kernel/setup_64.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff -puN arch/x86/kernel/setup_64.c~fix-wrong-proc-cpuinfo-on-x64 arch/x86/kernel/setup_64.c --- a/arch/x86/kernel/setup_64.c~fix-wrong-proc-cpuinfo-on-x64 +++ a/arch/x86/kernel/setup_64.c @@ -1131,8 +1131,6 @@ static int show_cpuinfo(struct seq_file #ifdef CONFIG_SMP - if (!cpu_online(c->cpu_index)) - return 0; cpu = c->cpu_index; #endif @@ -1224,15 +1222,15 @@ static int show_cpuinfo(struct seq_file static void *c_start(struct seq_file *m, loff_t *pos) { if (*pos == 0) /* just in case, cpu 0 is not the first */ - *pos = first_cpu(cpu_possible_map); - if ((*pos) < NR_CPUS && cpu_possible(*pos)) + *pos = first_cpu(cpu_online_map); + if ((*pos) < NR_CPUS && cpu_online(*pos)) return &cpu_data(*pos); return NULL; } static void *c_next(struct seq_file *m, void *v, loff_t *pos) { - *pos = next_cpu(*pos, cpu_possible_map); + *pos = next_cpu(*pos, cpu_online_map); return c_start(m, pos); } _