[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <3ca5f199-3fd8-34b0-14e4-2d9259b6fb6e@redhat.com>
Date: Tue, 6 Jul 2021 16:56:57 +0200
From: Paolo Bonzini <pbonzini@...hat.com>
To: isaku.yamahata@...el.com, Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>,
"H . Peter Anvin" <hpa@...or.com>,
Vitaly Kuznetsov <vkuznets@...hat.com>,
Wanpeng Li <wanpengli@...cent.com>,
Jim Mattson <jmattson@...gle.com>,
Joerg Roedel <joro@...tes.org>, erdemaktas@...gle.com,
Connor Kuehl <ckuehl@...hat.com>,
Sean Christopherson <seanjc@...gle.com>, x86@...nel.org,
linux-kernel@...r.kernel.org, kvm@...r.kernel.org
Cc: isaku.yamahata@...il.com,
Sean Christopherson <sean.j.christopherson@...el.com>
Subject: Re: [RFC PATCH v2 45/69] KVM: x86/mmu: Return old SPTE from
mmu_spte_clear_track_bits()
On 03/07/21 00:04, isaku.yamahata@...el.com wrote:
> From: Sean Christopherson <sean.j.christopherson@...el.com>
>
> Return the old SPTE when clearing a SPTE and push the "old SPTE present"
> check to the caller. Private shadow page support will use the old SPTE
> in rmap_remove() to determine whether or not there is a linked private
> shadow page.
>
> Signed-off-by: Sean Christopherson <sean.j.christopherson@...el.com>
> Signed-off-by: Isaku Yamahata <isaku.yamahata@...el.com>
> ---
> arch/x86/kvm/mmu/mmu.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> index 0259781cee6a..6b0c8c84aabe 100644
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -542,9 +542,9 @@ static bool mmu_spte_update(u64 *sptep, u64 new_spte)
> * Rules for using mmu_spte_clear_track_bits:
> * It sets the sptep from present to nonpresent, and track the
> * state bits, it is used to clear the last level sptep.
> - * Returns non-zero if the PTE was previously valid.
> + * Returns the old PTE.
> */
> -static int mmu_spte_clear_track_bits(u64 *sptep)
> +static u64 mmu_spte_clear_track_bits(u64 *sptep)
> {
> kvm_pfn_t pfn;
> u64 old_spte = *sptep;
> @@ -555,7 +555,7 @@ static int mmu_spte_clear_track_bits(u64 *sptep)
> old_spte = __update_clear_spte_slow(sptep, shadow_init_value);
>
> if (!is_shadow_present_pte(old_spte))
> - return 0;
> + return old_spte;
>
> pfn = spte_to_pfn(old_spte);
>
> @@ -572,7 +572,7 @@ static int mmu_spte_clear_track_bits(u64 *sptep)
> if (is_dirty_spte(old_spte))
> kvm_set_pfn_dirty(pfn);
>
> - return 1;
> + return old_spte;
> }
>
> /*
> @@ -1104,7 +1104,9 @@ static u64 *rmap_get_next(struct rmap_iterator *iter)
>
> static void drop_spte(struct kvm *kvm, u64 *sptep)
> {
> - if (mmu_spte_clear_track_bits(sptep))
> + u64 old_spte = mmu_spte_clear_track_bits(sptep);
> +
> + if (is_shadow_present_pte(old_spte))
> rmap_remove(kvm, sptep);
> }
>
>
Reviewed-by: Paolo Bonzini <pbonzini@...hat.com>
Powered by blists - more mailing lists