Re: [PATCH linux-next v2] x86/xen/time: prefer tsc as clocksource when it is invariant

From: Krister Johansen
Date: Mon Dec 12 2022 - 17:13:06 EST


On Mon, Dec 12, 2022 at 05:46:29PM +0100, Jan Beulich wrote:
> On 12.12.2022 17:05, Krister Johansen wrote:
> > Both the Intel SDM[4] and the Xen tsc documentation explain that marking
> > a tsc as invariant means that it should be considered stable by the OS
> > and is elibile to be used as a wall clock source. The Xen documentation
> > further clarifies that this is only reliable on HVM and PVH because PV
> > cannot intercept a cpuid instruction.
>
> Without meaning to express a view on the argumentation as a whole, this
> PV aspect is suspicious. Unless you open-code a use of the CPUID insn
> in the kernel, all uses of CPUID are going to be processed by Xen by
> virtue of the respective pvops hook. Documentation says what it says
> for environments where this might not be the case.

Thanks, appreciate the clarification here. Just restating this for my
own understanding: your advice would be to drop this check below?

> > + if (!(xen_hvm_domain() || xen_pvh_domain()))
> > + return 0;

And then update the commit message to dispense with the distinction
between HVM, PV, and PVH?

> > + cpuid(xen_cpuid_base() + 3, &eax, &ebx, &ecx, &edx);
>
> Xen leaf 3 has sub-leaves, so I think you need to set ecx to zero before
> this call.

The cpuid() inline in arch/x86/include/asm/processor.h assigns zero to
ecx prior to calling __cpuid. In arch/x86/boot/cpuflags.c the macros
are a little different, but it looks like there too, the macro passes 0
as an input argument to cpuid_count which ends up being %ecx. Happy to
fix this up if I'm looking at the wrong cpuid functions, though.

-K