From: Sean Christopherson <seanjc@google.com>
To: David Matlack <dmatlack@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, Ben Gardon <bgardon@google.com>,
Joerg Roedel <joro@8bytes.org>, Jim Mattson <jmattson@google.com>,
Wanpeng Li <wanpengli@tencent.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Janis Schoetterl-Glausch <scgl@linux.vnet.ibm.com>,
Junaid Shahid <junaids@google.com>,
Oliver Upton <oupton@google.com>,
Harish Barathvajasankar <hbarath@google.com>,
Peter Xu <peterx@redhat.com>, Peter Shier <pshier@google.com>
Subject: Re: [RFC PATCH 04/15] KVM: x86/mmu: Factor out logic to atomically install a new page table
Date: Wed, 1 Dec 2021 19:13:55 +0000 [thread overview]
Message-ID: <YafJc1GHcxTG19p7@google.com> (raw)
In-Reply-To: <20211119235759.1304274-5-dmatlack@google.com>
On Fri, Nov 19, 2021, David Matlack wrote:
> Factor out the logic to atomically replace an SPTE with an SPTE that
> points to a new page table. This will be used in a follow-up commit to
> split a large page SPTE into one level lower.
>
> Signed-off-by: David Matlack <dmatlack@google.com>
> ---
> arch/x86/kvm/mmu/tdp_mmu.c | 53 ++++++++++++++++++++++++++------------
> 1 file changed, 37 insertions(+), 16 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c
> index cc9fe33c9b36..9ee3f4f7fdf5 100644
> --- a/arch/x86/kvm/mmu/tdp_mmu.c
> +++ b/arch/x86/kvm/mmu/tdp_mmu.c
> @@ -945,6 +945,39 @@ static int tdp_mmu_map_handle_target_level(struct kvm_vcpu *vcpu,
> return ret;
> }
>
> +/*
> + * tdp_mmu_install_sp_atomic - Atomically replace the given spte with an
> + * spte pointing to the provided page table.
> + *
> + * @kvm: kvm instance
> + * @iter: a tdp_iter instance currently on the SPTE that should be set
> + * @sp: The new TDP page table to install.
> + * @account_nx: True if this page table is being installed to split a
> + * non-executable huge page.
> + *
> + * Returns: True if the new page table was installed. False if spte being
> + * replaced changed, causing the atomic compare-exchange to fail.
> + * If this function returns false the sp will be freed before
> + * returning.
> + */
> +static bool tdp_mmu_install_sp_atomic(struct kvm *kvm,
> + struct tdp_iter *iter,
> + struct kvm_mmu_page *sp,
> + bool account_nx)
> +{
> + u64 spte;
> +
> + spte = make_nonleaf_spte(sp->spt, !shadow_accessed_mask);
This can easily go on one line.
u64 spte = make_nonleaf_spte(sp->spt, !shadow_accessed_mask);
> +
> + if (tdp_mmu_set_spte_atomic(kvm, iter, spte)) {
> + tdp_mmu_link_page(kvm, sp, account_nx);
> + return true;
> + } else {
> + tdp_mmu_free_sp(sp);
> + return false;
I don't think this helper should free the sp on failure, even if that's what all
paths end up doing. When reading the calling code, it really looks like the sp
is being leaked because the allocation and free are in different contexts. That
the sp is consumed on success is fairly intuitive given the "install" action, but
freeing on failure not so much.
And for the eager splitting, freeing on failure is wasteful. It's extremely
unlikely to happen often, so in practice it's unlikely to be an issue, but it's
certainly odd since the loop is likely going to immediately allocate another sp,
either for the current spte or for the next spte.
Side topic, tdp_mmu_set_spte_atomic() and friends really should return 0/-EBUSY.
Boolean returns for errors usually end in tears sooner or later.
next prev parent reply other threads:[~2021-12-01 19:14 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-19 23:57 [RFC PATCH 00/15] KVM: x86/mmu: Eager Page Splitting for the TDP MMU David Matlack
2021-11-19 23:57 ` [RFC PATCH 01/15] KVM: x86/mmu: Rename rmap_write_protect to kvm_vcpu_write_protect_gfn David Matlack
2021-11-22 18:52 ` Ben Gardon
2021-11-26 12:18 ` Peter Xu
2021-11-19 23:57 ` [RFC PATCH 02/15] KVM: x86/mmu: Rename __rmap_write_protect to rmap_write_protect David Matlack
2021-11-22 18:52 ` Ben Gardon
2021-11-26 12:18 ` Peter Xu
2021-11-19 23:57 ` [RFC PATCH 03/15] KVM: x86/mmu: Automatically update iter->old_spte if cmpxchg fails David Matlack
2021-11-22 18:52 ` Ben Gardon
2021-11-30 23:25 ` David Matlack
2021-11-19 23:57 ` [RFC PATCH 04/15] KVM: x86/mmu: Factor out logic to atomically install a new page table David Matlack
2021-11-22 18:52 ` Ben Gardon
2021-11-30 23:27 ` David Matlack
2021-12-01 19:13 ` Sean Christopherson [this message]
2021-12-01 21:52 ` David Matlack
2021-11-19 23:57 ` [RFC PATCH 05/15] KVM: x86/mmu: Abstract mmu caches out to a separate struct David Matlack
2021-11-22 18:55 ` Ben Gardon
2021-11-22 18:55 ` Ben Gardon
2021-11-30 23:28 ` David Matlack
2021-11-19 23:57 ` [RFC PATCH 06/15] KVM: x86/mmu: Derive page role from parent David Matlack
2021-11-20 12:53 ` Paolo Bonzini
2021-11-27 2:07 ` Lai Jiangshan
2021-11-27 10:26 ` Paolo Bonzini
2021-11-30 23:31 ` David Matlack
2021-12-01 0:45 ` Sean Christopherson
2021-12-01 21:56 ` David Matlack
2021-11-19 23:57 ` [RFC PATCH 07/15] KVM: x86/mmu: Pass in vcpu->arch.mmu_caches instead of vcpu David Matlack
2021-11-22 18:56 ` Ben Gardon
2021-11-19 23:57 ` [RFC PATCH 08/15] KVM: x86/mmu: Helper method to check for large and present sptes David Matlack
2021-11-22 18:56 ` Ben Gardon
2021-12-01 18:34 ` Sean Christopherson
2021-12-01 21:13 ` David Matlack
2021-11-19 23:57 ` [RFC PATCH 09/15] KVM: x86/mmu: Move restore_acc_track_spte to spte.c David Matlack
2021-11-22 18:56 ` Ben Gardon
2021-11-19 23:57 ` [RFC PATCH 10/15] KVM: x86/mmu: Abstract need_resched logic from tdp_mmu_iter_cond_resched David Matlack
2021-11-22 18:56 ` Ben Gardon
2021-11-19 23:57 ` [RFC PATCH 11/15] KVM: x86/mmu: Refactor tdp_mmu iterators to take kvm_mmu_page root David Matlack
2021-11-22 18:56 ` Ben Gardon
2021-11-19 23:57 ` [RFC PATCH 12/15] KVM: x86/mmu: Split large pages when dirty logging is enabled David Matlack
2021-11-22 5:05 ` Nikunj A. Dadhania
2021-11-30 23:33 ` David Matlack
2021-11-22 19:30 ` Ben Gardon
2021-11-30 23:44 ` David Matlack
2021-11-26 12:01 ` Peter Xu
2021-11-30 23:56 ` David Matlack
2021-12-01 1:00 ` Sean Christopherson
2021-12-01 1:29 ` David Matlack
2021-12-01 2:29 ` Peter Xu
2021-12-01 18:29 ` Sean Christopherson
2021-12-01 21:36 ` David Matlack
2021-12-01 23:37 ` Sean Christopherson
2021-12-02 17:41 ` David Matlack
2021-12-02 18:42 ` Sean Christopherson
2021-12-03 0:00 ` David Matlack
2021-12-03 1:07 ` Sean Christopherson
2021-12-03 17:22 ` David Matlack
2021-11-19 23:57 ` [RFC PATCH 13/15] KVM: x86/mmu: Split large pages during CLEAR_DIRTY_LOG David Matlack
2021-11-26 12:17 ` Peter Xu
2021-12-01 0:16 ` David Matlack
2021-12-01 0:17 ` David Matlack
2021-12-01 4:03 ` Peter Xu
2021-12-01 22:14 ` David Matlack
2021-12-03 4:57 ` Peter Xu
2021-12-01 19:22 ` Sean Christopherson
2021-12-01 19:49 ` Ben Gardon
2021-12-01 20:16 ` Sean Christopherson
2021-12-01 22:11 ` Ben Gardon
2021-12-01 22:17 ` David Matlack
2021-11-19 23:57 ` [RFC PATCH 14/15] KVM: x86/mmu: Add tracepoint for splitting large pages David Matlack
2021-11-19 23:57 ` [RFC PATCH 15/15] KVM: x86/mmu: Update page stats when " David Matlack
2021-12-01 19:36 ` Sean Christopherson
2021-12-01 21:11 ` David Matlack
2021-11-26 14:13 ` [RFC PATCH 00/15] KVM: x86/mmu: Eager Page Splitting for the TDP MMU Peter Xu
2021-11-30 23:22 ` David Matlack
2021-12-01 4:10 ` Peter Xu
2021-12-01 4:19 ` Peter Xu
2021-12-01 21:46 ` David Matlack
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YafJc1GHcxTG19p7@google.com \
--to=seanjc@google.com \
--cc=bgardon@google.com \
--cc=dmatlack@google.com \
--cc=hbarath@google.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=junaids@google.com \
--cc=kvm@vger.kernel.org \
--cc=oupton@google.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=pshier@google.com \
--cc=scgl@linux.vnet.ibm.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).