Sean Christopherson <seanjc@xxxxxxxxxx> writes: > On Wed, Sep 21, 2022, Vitaly Kuznetsov wrote: ... >> +} >> + >> +/* Delay */ >> +static inline void rep_nop(void) > > LOL, rep_nop() is a hilariously confusing function name. "REP NOP" is "PAUSE", > and for whatever reason the kernel proper use rep_nop() as the function name for > the wrapper. My reaction to the MFENCE+rep_nop() below was "how the hell does > MFENCE+PAUSE guarantee a delay?!?". Well, at least you got the joke :-) > > Anyways, why not do e.g. usleep(1)? I was under the impression that all these 'sleep' functions result in a syscall (and I do see TRIPLE_FAULT when I swap my rep_nop() with usleep()) and here we need to wait in the guest (sender) ... > And if you really need a udelay() and not a > usleep(), IMO it's worth adding exactly that instead of throwing NOPs at the CPU. > E.g. aarch64 KVM selftests already implements udelay(), so adding an x86 variant > would move us one step closer to being able to use it in common tests. ... so yes, I think we need a delay. The problem with implementing udelay() is that TSC frequency is unknown. We can get it from kvmclock but setting up kvmclock pages for all selftests looks like an overkill. Hyper-V emulation gives us HV_X64_MSR_TSC_FREQUENCY but that's not generic enough. Alternatively, we can use KVM_GET_TSC_KHZ when creating a vCPU but we'll need to pass the value to guest code somehow. AFAIR, we can use CPUID.0x15 and/or MSR_PLATFORM_INFO (0xce) or even introduce a PV MSR for our purposes -- or am I missing an obvious "easy" solution? I'm thinking about being lazy here and implemnting a Hyper-V specific udelay through HV_X64_MSR_TSC_FREQUENCY (unless you object, of course) to avoid bloating this series beyond 46 patches it already has. ... -- Vitaly