RE: detecting hyperthreading in linux 2.4.19

Mikael Pettersson (mikpe@csd.uu.se)
Fri, 10 Jan 2003 09:43:51 +0100


Pallipadi, Venkatesh writes:
>
> > -----Original Message-----
> > From: Mikael Pettersson [mailto:mikpe@csd.uu.se]
> >
> > My performance monitoring counters driver uses this approach
> > in kernel-space
> > using smp_call_function(). I don't use the siblings tables
> > because they suck :-)
> > [I don't think they distinguish between logical CPUs #0 and
> > #1, and they aren't
> > exported to modules. The CPUID check is simple and portable
> > across kernel versions.]
>
> I believe it is better to use a OS interface to find out HT, rather than
> using CPUID. The reason being, it is possible to have HT disabled, in OS,
> even after processor and the BIOS supports it.
> 1) Consider the case when processor and BIOS supports HT, but linux
> was booted with "noht" boot option (now I am not sure whether that option is
> there in 2.4.19. But is is certainly there in some other kernels).
> 2) What about some other kernel which is totally ignorant about HT, and
> doesn't initialize logical processor (kernel which looks at MPS in place
> of ACPI)
> I think, in both these cases cpuid can still say HT is present.

With smp_call_function() I execute code on exactly those CPUs the kernel
knows about. If the physical processors support HT but the kernel can't
run on the non-#0 logical CPUs (UP kernel or "noht"), then smp_call_function()
won't reach those logical CPUs #1 and everything's fine: my test will say
"not HT" which is exactly what I want in this case.

The point about checking the "local APIC physical ID" in CPUID 1, EBX,
instead of the field in the local APIC is _exactly_ because the CPUID
data is assigned by HW and read-only, while the local APIC field can be
changed. I don't want to depend on possibly-broken MP or ACPI tables or
have to know about the kernel's physical <--> virtual CPU # mapping de jour.

> I know that sibling table is not exported. But I couldn't get your other
> comment about sibling table "they distinguish between logical CPUs #0 and #1:"
> Can you elaborate..

The sibling table tells you whether two linux-numbered CPUs are siblings,
but it doesn't tell which one is logical CPU #0 and which one is #1.
That distinction is important in some cases.
-
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/