diff -urN x/Documentation/kernel-parameters.txt y/Documentation/kernel-parameters.txt --- x/Documentation/kernel-parameters.txt 2004-08-24 17:20:00.000000000 +1000 +++ y/Documentation/kernel-parameters.txt 2005-05-19 20:25:10.000000000 +1000 @@ -451,6 +451,10 @@ hisax= [HW,ISDN] See Documentation/isdn/README.HiSax. + ht= [HW,IA-32,SMP] + ht=on: Enable Hyper Threading + ht=off: Disable Hyper Threading + hugepages= [HW,IA-32,IA-64] Maximal number of HugeTLB pages. noirqbalance [IA-32,SMP,KNL] Disable kernel irq balancing diff -urN x/arch/i386/Kconfig y/arch/i386/Kconfig --- x/arch/i386/Kconfig 2005-04-06 20:07:04.000000000 +1000 +++ y/arch/i386/Kconfig 2005-05-19 20:19:55.000000000 +1000 @@ -1326,6 +1326,11 @@ depends on SMP && !(X86_VISWS || X86_VOYAGER) default y +config X86_HT_DISABLE + bool + depends on X86_HT + default y + config X86_BIOS_REBOOT bool depends on !(X86_VISWS || X86_VOYAGER) diff -urN x/arch/i386/kernel/cpu/intel.c y/arch/i386/kernel/cpu/intel.c --- x/arch/i386/kernel/cpu/intel.c 2004-08-24 17:16:24.000000000 +1000 +++ y/arch/i386/kernel/cpu/intel.c 2005-05-19 20:19:07.000000000 +1000 @@ -267,6 +267,7 @@ #ifdef CONFIG_X86_HT if (cpu_has(c, X86_FEATURE_HT)) { extern int phys_proc_id[NR_CPUS]; + extern int disable_ht; u32 eax, ebx, ecx, edx; int index_lsb, index_msb, tmp; @@ -275,6 +276,9 @@ cpuid(1, &eax, &ebx, &ecx, &edx); smp_num_siblings = (ebx & 0xff0000) >> 16; + if (disable_ht) + smp_num_siblings = 1; + if (smp_num_siblings == 1) { printk(KERN_INFO "CPU: Hyper-Threading is disabled\n"); } else if (smp_num_siblings > 1 ) { diff -urN x/arch/i386/kernel/setup.c y/arch/i386/kernel/setup.c --- x/arch/i386/kernel/setup.c 2005-04-06 20:11:18.000000000 +1000 +++ y/arch/i386/kernel/setup.c 2005-05-19 20:18:01.000000000 +1000 @@ -57,6 +57,13 @@ unsigned long init_pg_tables_end __initdata = ~0UL; int disable_pse __initdata = 0; +#ifdef CONFIG_X86_HT +#ifdef CONFIG_X86_HT_DISABLE +int disable_ht __initdata = 1; +#else +int disable_ht __initdata = 0; +#endif +#endif /* * Machine setup.. @@ -802,6 +809,13 @@ #endif /* CONFIG_X86_LOCAL_APIC */ #endif /* CONFIG_ACPI_BOOT */ +#ifdef CONFIG_X86_HT + else if (!memcmp(from, "ht=on", 5)) + disable_ht = 0; + else if (!memcmp(from, "ht=off", 6)) + disable_ht = 1; +#endif + /* * highmem=size forces highmem to be exactly 'size' bytes. * This works even on boxes that have no highmem otherwise. diff -urN x/arch/x86_64/Kconfig y/arch/x86_64/Kconfig --- x/arch/x86_64/Kconfig 2004-08-24 17:18:41.000000000 +1000 +++ y/arch/x86_64/Kconfig 2005-05-19 20:20:45.000000000 +1000 @@ -165,6 +165,11 @@ bool depends on SMP && !MK8 default y + +config X86_HT_DISABLE + bool + depends on X86_HT + default y config MATH_EMULATION bool