Hyper-Threading disabled on Pentium 4

Urs Thuermann <[email protected]> 26 Aug 2004 13:17:18 +0200
Newsgroups org.kernel.vger.linux-smp
Message-ID <[email protected]>
I'd like to run an SMP kernel with Hyper-Threading on a Pentium 4
processor, but dmesg tells me, it's disabled.  Sorry, I don't know
what mainboard this is.

AFAIK, the CPU is able to do Hyper-Threading, and also /proc/cpuinfo
seems to indicate so:

    $ cat /proc/cpuinfo
    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 15
    model           : 2
    model name      : Intel(R) Pentium(R) 4 CPU 2.40GHz
    stepping        : 7
    cpu MHz         : 2424.718
    cache size      : 512 KB
    physical id     : 0
    siblings        : 1
    fdiv_bug        : no
    hlt_bug         : no
    f00f_bug        : no
    coma_bug        : no
    fpu             : yes
    fpu_exception   : yes
    cpuid level     : 2
    wp              : yes
    flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe cid
    bogomips        : 4784.12
    
    $

I think, the ht flag means Hyper-Threading, right?  However, when I
boot with a Linux-2.6.7 SMP kernel, I find the following in dmesg
output:

    Initializing CPU#0
    PID hash table entries: 2048 (order 11: 16384 bytes)
    Detected 2424.718 MHz processor.
    Using tsc for high-res timesource
    Console: colour VGA+ 80x25
    Memory: 515808k/524208k available (1769k kernel code, 7656k reserved, 606k data, 372k init, 0k highmem)
    Checking if this processor honours the WP bit even in supervisor mode... Ok.
    Calibrating delay loop... 4784.12 BogoMIPS
    Security Scaffold v1.0.0 initialized
    Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
    Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
    Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
    CPU:     After generic identify, caps: bfebfbff 00000000 00000000 00000000
    CPU:     After vendor identify, caps: bfebfbff 00000000 00000000 00000000
    CPU: Trace cache: 12K uops, L1 D cache: 8K
    CPU: L2 cache: 512K
    CPU: Hyper-Threading is disabled
    CPU:     After all inits, caps: bfebfbff 00000000 00000000 00000080
    Intel machine check architecture supported.
    Intel machine check reporting enabled on CPU#0.
    CPU0: Intel P4/Xeon Extended MCE MSRs (12) available
    CPU0: Thermal monitoring enabled
    Enabling fast FPU save and restore... done.
    Enabling unmasked SIMD FPU exception support... done.
    Checking 'hlt' instruction... OK.
    CPU0: Intel(R) Pentium(R) 4 CPU 2.40GHz stepping 07
    per-CPU timeslice cutoff: 1462.74 usecs.

Looking into linux-2.6.7/arch/i386/kernel/cpu/intel.c, I found the
message comes from the code

     cpuid(1, &eax, &ebx, &ecx, &edx);
     smp_num_siblings = (ebx & 0xff0000) >> 16;

     if (smp_num_siblings == 1) {
             printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
     } else if (smp_num_siblings > 1 ) {

So why does the CPUID instruction yield only one sibling?  Is this a
known problem?  Is there a way to enable Hyper-Threading on that
machine?


urs