Re: [PATCH 0/2] KVM: x86: Fix and cleanup for recent AVIC changes

From: Paolo Bonzini
Date: Fri Oct 15 2021 - 12:23:48 EST


On 15/10/21 18:15, Sean Christopherson wrote:

- now vCPU1 finally starts running the page fault code.

- vCPU1 AVIC is still enabled
(because vCPU1 never handled KVM_REQ_APICV_UPDATE),
so the page fault code will populate the SPTE.
But vCPU1 won't install the SPTE if it loses the race to acquire mmu_lock, because
kvm_zap_gfn_range() bumps the notifier sequence and so vCPU1 will retry the fault.
If vCPU1 wins the race, i.e. sees the same sequence number, then the zap is
guaranteed to find the newly-installed SPTE.

And IMO, retrying is the desired behavior. Installing a SPTE based on the global
state works, but it's all kinds of weird to knowingly take an action the directly
contradicts the current vCPU state.

I think both of you are correct. :)

Installing a SPTE based on global state is weird because this is a vCPU action; installing it based on vCPU state is weird because it is knowingly out of date. I tend to be more on Maxim's side, but that may be simply because I have reviewed the code earlier and the various interleavings are still somewhere in my brain.

It certainly deserves a comment though. The behavior wrt the sequence number is particularly important if you use the vCPU state, but it's worth pointing out even with the current code; this exchange shows that it can be confusing.

Paolo