On 30/04/20 13:33, Vitaly Kuznetsov wrote: >> I would expect that it needs to keep it in a global variable anyway, but >> yes this is a good point. You can also keep the ACK MSR and store the >> pending bit in the other MSR, kind of like you have separate ISR and EOI >> registers in the LAPIC. >> > Honestly I was inspired by Hyper-V's HV_X64_MSR_EOM MSR as the protocol > we're trying to come up with here is very similar to HV messaging) Oh, that's true actually. > I'm not exactly sure why we need the pending bit after we drop #PF. When > we call kvm_check_async_pf_completion() from MSR_KVM_ASYNC_PF_ACK write > it will (in case there are page ready events in the queue) check if the > slot is empty, put one there and raise IRQ regardless of guest's current > state. It may or may not get injected immediately but we don't care.> The second invocation of kvm_check_async_pf_completion() from vcpu_run() > will just go away. You're right, you can just use the value in the guest to see if the guest is ready. This is also similar to how #VE handles re-entrancy, however because this is an interrupt we have IF to delay the IRQ until after the interrupt handler has finished. By dropping the #PF page ready case, we can also drop the ugly case where WRMSR injects a page ready page fault even if IF=0. That one is safe on Linux, but Andy didn't like it. Paolo