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>,
"Nikunj A . Dadhania" <nikunj@amd.com>
Subject: Re: [PATCH v1 03/13] KVM: x86/mmu: Automatically update iter->old_spte if cmpxchg fails
Date: Thu, 6 Jan 2022 00:54:31 +0000 [thread overview]
Message-ID: <YdY9x7nNtMs0kyvm@google.com> (raw)
In-Reply-To: <20211213225918.672507-4-dmatlack@google.com>
On Mon, Dec 13, 2021, David Matlack wrote:
> Consolidate a bunch of code that was manually re-reading the spte if the
> cmpxchg fails. There is no extra cost of doing this because we already
> have the spte value as a result of the cmpxchg (and in fact this
> eliminates re-reading the spte), and none of the call sites depend on
> iter->old_spte retaining the stale spte value.
>
> Signed-off-by: David Matlack <dmatlack@google.com>
> ---
> arch/x86/kvm/mmu/tdp_mmu.c | 50 ++++++++++++++++----------------------
> 1 file changed, 21 insertions(+), 29 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c
> index b69e47e68307..656ebf5b20dc 100644
> --- a/arch/x86/kvm/mmu/tdp_mmu.c
> +++ b/arch/x86/kvm/mmu/tdp_mmu.c
> @@ -492,16 +492,22 @@ static void handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn,
> * and handle the associated bookkeeping. Do not mark the page dirty
> * in KVM's dirty bitmaps.
> *
> + * If setting the SPTE fails because it has changed, iter->old_spte will be
> + * updated with the updated value of the spte.
First updated=>refreshed, second updated=>current? More below.
> + *
> * @kvm: kvm instance
> * @iter: a tdp_iter instance currently on the SPTE that should be set
> * @new_spte: The value the SPTE should be set to
> * Returns: true if the SPTE was set, false if it was not. If false is returned,
> - * this function will have no side-effects.
> + * this function will have no side-effects other than updating
s/updating/setting
> + * iter->old_spte to the latest value of spte.
Strictly speaking, "latest" may not be true if yet another thread modifies the
SPTE. Maybe this?
iter->old_spte to the last known value of the SPTE.
> */
> static inline bool tdp_mmu_set_spte_atomic(struct kvm *kvm,
> struct tdp_iter *iter,
> u64 new_spte)
> {
> + u64 old_spte;
> +
> lockdep_assert_held_read(&kvm->mmu_lock);
>
> /*
> @@ -515,9 +521,15 @@ static inline bool tdp_mmu_set_spte_atomic(struct kvm *kvm,
> * Note, fast_pf_fix_direct_spte() can also modify TDP MMU SPTEs and
> * does not hold the mmu_lock.
> */
> - if (cmpxchg64(rcu_dereference(iter->sptep), iter->old_spte,
> - new_spte) != iter->old_spte)
> + old_spte = cmpxchg64(rcu_dereference(iter->sptep), iter->old_spte, new_spte);
To make this a bit easier to read, and to stay under 80 chars, how about
opportunistically doing this as well?
diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c
index 656ebf5b20dc..64f1369f8638 100644
--- a/arch/x86/kvm/mmu/tdp_mmu.c
+++ b/arch/x86/kvm/mmu/tdp_mmu.c
@@ -506,6 +506,7 @@ static inline bool tdp_mmu_set_spte_atomic(struct kvm *kvm,
struct tdp_iter *iter,
u64 new_spte)
{
+ u64 *sptep = rcu_dereference(iter->sptep);
u64 old_spte;
lockdep_assert_held_read(&kvm->mmu_lock);
@@ -521,7 +522,7 @@ static inline bool tdp_mmu_set_spte_atomic(struct kvm *kvm,
* Note, fast_pf_fix_direct_spte() can also modify TDP MMU SPTEs and
* does not hold the mmu_lock.
*/
- old_spte = cmpxchg64(rcu_dereference(iter->sptep), iter->old_spte, new_spte);
+ old_spte = cmpxchg64(sptep, iter->old_spte, new_spte);
if (old_spte != iter->old_spte) {
/*
* The cmpxchg failed because the spte was updated by another
> + if (old_spte != iter->old_spte) {
> + /*
> + * The cmpxchg failed because the spte was updated by another
> + * thread so record the updated spte in old_spte.
> + */
Hmm, this is a bit awkward. I think it's the double use of "updated" and the
somewhat ambiguous reference to "old_spte". I'd also avoid "thread", as this
requires interference from not only a different task, but a different logical CPU
since iter->old_spte is refreshed if mmu_lock is dropped and reacquired. And
"record" is an odd choice of word since it sounds like storing the current value
is only for logging/debugging.
Something like this?
/*
* The entry was modified by a different logical CPU, refresh
* iter->old_spte with the current value so the caller operates
* on fresh data, e.g. if it retries tdp_mmu_set_spte_atomic().
*/
Nits aside,
Reviewed-by: Sean Christopherson <seanjc@google.com>
> + iter->old_spte = old_spte;
> return false;
> + }
>
> __handle_changed_spte(kvm, iter->as_id, iter->gfn, iter->old_spte,
> new_spte, iter->level, true);
next prev parent reply other threads:[~2022-01-06 0:55 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-13 22:59 [PATCH v1 00/13] KVM: x86/mmu: Eager Page Splitting for the TDP MMU David Matlack
2021-12-13 22:59 ` [PATCH v1 01/13] KVM: x86/mmu: Rename rmap_write_protect to kvm_vcpu_write_protect_gfn David Matlack
2022-01-06 0:35 ` Sean Christopherson
2021-12-13 22:59 ` [PATCH v1 02/13] KVM: x86/mmu: Rename __rmap_write_protect to rmap_write_protect David Matlack
2022-01-06 0:35 ` Sean Christopherson
2021-12-13 22:59 ` [PATCH v1 03/13] KVM: x86/mmu: Automatically update iter->old_spte if cmpxchg fails David Matlack
2022-01-04 10:13 ` Peter Xu
2022-01-04 17:29 ` Ben Gardon
2022-01-06 0:54 ` Sean Christopherson [this message]
2022-01-06 18:04 ` David Matlack
2021-12-13 22:59 ` [PATCH v1 04/13] KVM: x86/mmu: Factor out logic to atomically install a new page table David Matlack
2022-01-04 10:32 ` Peter Xu
2022-01-04 18:26 ` David Matlack
2022-01-05 1:00 ` Peter Xu
2022-01-06 20:12 ` Sean Christopherson
2022-01-06 22:56 ` David Matlack
2022-01-07 18:24 ` David Matlack
2022-01-07 21:39 ` Sean Christopherson
2021-12-13 22:59 ` [PATCH v1 05/13] KVM: x86/mmu: Move restore_acc_track_spte to spte.c David Matlack
2022-01-04 10:33 ` Peter Xu
2022-01-06 20:27 ` Sean Christopherson
2022-01-06 22:58 ` David Matlack
2021-12-13 22:59 ` [PATCH v1 06/13] KVM: x86/mmu: Refactor tdp_mmu iterators to take kvm_mmu_page root David Matlack
2022-01-04 10:35 ` Peter Xu
2022-01-06 20:34 ` Sean Christopherson
2022-01-06 22:57 ` David Matlack
2021-12-13 22:59 ` [PATCH v1 07/13] KVM: x86/mmu: Derive page role from parent David Matlack
2022-01-05 7:51 ` Peter Xu
2022-01-06 20:45 ` Sean Christopherson
2022-01-06 23:00 ` David Matlack
2021-12-13 22:59 ` [PATCH v1 08/13] KVM: x86/mmu: Refactor TDP MMU child page initialization David Matlack
2022-01-05 7:51 ` Peter Xu
2022-01-06 20:59 ` Sean Christopherson
2022-01-06 22:08 ` David Matlack
2022-01-06 23:02 ` Sean Christopherson
2021-12-13 22:59 ` [PATCH v1 09/13] KVM: x86/mmu: Split huge pages when dirty logging is enabled David Matlack
2022-01-05 7:54 ` Peter Xu
2022-01-05 17:49 ` David Matlack
2022-01-06 22:48 ` Sean Christopherson
2022-01-06 21:28 ` Sean Christopherson
2022-01-06 22:20 ` David Matlack
2022-01-06 22:56 ` Sean Christopherson
2022-01-07 2:02 ` Peter Xu
2022-01-07 2:06 ` Peter Xu
2021-12-13 22:59 ` [PATCH v1 10/13] KVM: Push MMU locking down into kvm_arch_mmu_enable_log_dirty_pt_masked David Matlack
2021-12-13 22:59 ` [PATCH v1 11/13] KVM: x86/mmu: Split huge pages during CLEAR_DIRTY_LOG David Matlack
2022-01-05 9:02 ` Peter Xu
2022-01-05 17:55 ` David Matlack
2022-01-05 17:57 ` David Matlack
2021-12-13 22:59 ` [PATCH v1 12/13] KVM: x86/mmu: Add tracepoint for splitting huge pages David Matlack
2022-01-05 8:38 ` Peter Xu
2022-01-06 23:14 ` Sean Christopherson
2022-01-07 0:54 ` David Matlack
2021-12-13 22:59 ` [PATCH v1 13/13] KVM: selftests: Add an option to disable MANUAL_PROTECT_ENABLE and INITIALLY_SET David Matlack
2022-01-05 8:38 ` Peter Xu
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=YdY9x7nNtMs0kyvm@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=nikunj@amd.com \
--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).