lkml.org 
[lkml]   [2022]   [Oct]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v11 07/46] KVM: x86: Move clearing of TLB_FLUSH_CURRENT to kvm_vcpu_flush_tlb_all()
    Date
    From: Sean Christopherson <seanjc@google.com>

    Clear KVM_REQ_TLB_FLUSH_CURRENT in kvm_vcpu_flush_tlb_all() instead of in
    its sole caller that processes KVM_REQ_TLB_FLUSH. Regardless of why/when
    kvm_vcpu_flush_tlb_all() is called, flushing "all" TLB entries also
    flushes "current" TLB entries.

    Ideally, there will never be another caller of kvm_vcpu_flush_tlb_all(),
    and moving the handling "requires" extra work to document the ordering
    requirement, but future Hyper-V paravirt TLB flushing support will add
    similar logic for flush "guest" (Hyper-V can flush a subset of "guest"
    entries). And in the Hyper-V case, KVM needs to do more than just clear
    the request, the queue of GPAs to flush also needs to purged, and doing
    all only in the request path is undesirable as kvm_vcpu_flush_tlb_guest()
    does have multiple callers (though it's unlikely KVM's paravirt TLB flush
    will coincide with Hyper-V's paravirt TLB flush).

    Move the logic even though it adds extra "work" so that KVM will be
    consistent with how flush requests are processed when the Hyper-V support
    lands.

    No functional change intended.

    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    ---
    arch/x86/kvm/x86.c | 14 ++++++++++----
    1 file changed, 10 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index ee9d88f0e84c..f1e3a4ec53ba 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -3383,6 +3383,9 @@ static void kvm_vcpu_flush_tlb_all(struct kvm_vcpu *vcpu)
    {
    ++vcpu->stat.tlb_flush;
    static_call(kvm_x86_flush_tlb_all)(vcpu);
    +
    + /* Flushing all ASIDs flushes the current ASID... */
    + kvm_clear_request(KVM_REQ_TLB_FLUSH_CURRENT, vcpu);
    }

    static void kvm_vcpu_flush_tlb_guest(struct kvm_vcpu *vcpu)
    @@ -10464,12 +10467,15 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
    kvm_mmu_sync_roots(vcpu);
    if (kvm_check_request(KVM_REQ_LOAD_MMU_PGD, vcpu))
    kvm_mmu_load_pgd(vcpu);
    - if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) {
    +
    + /*
    + * Note, the order matters here, as flushing "all" TLB entries
    + * also flushes the "current" TLB entries, i.e. servicing the
    + * flush "all" will clear any request to flush "current".
    + */
    + if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu))
    kvm_vcpu_flush_tlb_all(vcpu);

    - /* Flushing all ASIDs flushes the current ASID... */
    - kvm_clear_request(KVM_REQ_TLB_FLUSH_CURRENT, vcpu);
    - }
    kvm_service_local_tlb_flush_requests(vcpu);

    if (kvm_check_request(KVM_REQ_REPORT_TPR_ACCESS, vcpu)) {
    --
    2.37.3
    \
     
     \ /
      Last update: 2022-10-04 14:41    [W:3.713 / U:0.368 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site