From: "Andi Kleen" Scheduler support for AMD CMP AMD dual core looks like HT but isn't really. Hide it from the scheduler. This works around problems with the domain scheduler. Also probably gives slightly better scheduling and disables SMT nice which is harmful on dual core. We still display it like HT in /proc/cpuinfo. This is to make it appear the same to license managers so that they count dual cores only as a single physical CPU. Signed-off-by: Andi Kleen Signed-off-by: Andrew Morton --- 25-akpm/arch/x86_64/kernel/setup.c | 24 ++++++++++++++++++------ 1 files changed, 18 insertions(+), 6 deletions(-) diff -puN arch/x86_64/kernel/setup.c~x86_64-scheduler-support-for-amd-cmp arch/x86_64/kernel/setup.c --- 25/arch/x86_64/kernel/setup.c~x86_64-scheduler-support-for-amd-cmp 2004-11-28 01:54:40.113498928 -0800 +++ 25-akpm/arch/x86_64/kernel/setup.c 2004-11-28 01:54:40.117498320 -0800 @@ -771,6 +771,19 @@ static void __init detect_ht(struct cpui } #endif } + +static void __init sched_cmp_hack(struct cpuinfo_x86 *c) +{ +#ifdef CONFIG_SMP + /* AMD dual core looks like HT but isn't really. Hide it from the + scheduler. This works around problems with the domain scheduler. + Also probably gives slightly better scheduling and disables + SMT nice which is harmful on dual core. + TBD tune the domain scheduler for dual core. */ + if (c->x86_vendor == X86_VENDOR_AMD && cpu_has(c, X86_FEATURE_CMP_LEGACY)) + smp_num_siblings = 1; +#endif +} static void __init init_intel(struct cpuinfo_x86 *c) { @@ -914,7 +927,8 @@ void __init identify_cpu(struct cpuinfo_ select_idle_routine(c); detect_ht(c); - + sched_cmp_hack(c); + /* * On SMP, boot_cpu_data holds the common feature set between * all CPUs; so make sure that we indicate which features are @@ -1038,11 +1052,9 @@ static int show_cpuinfo(struct seq_file if (c->x86_cache_size >= 0) seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size); -#ifdef CONFIG_X86_HT - if (smp_num_siblings > 1) { - seq_printf(m, "physical id\t: %d\n", phys_proc_id[c - cpu_data]); - seq_printf(m, "siblings\t: %d\n", smp_num_siblings); - } +#ifdef CONFIG_SMP + seq_printf(m, "physical id\t: %d\n", phys_proc_id[c - cpu_data]); + seq_printf(m, "siblings\t: %d\n", c->x86_num_cores * smp_num_siblings); #endif seq_printf(m, _