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