From: Sean Christopherson <seanjc@google.com>
To: Yu Zhang <yu.c.zhang@linux.intel.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Ben Gardon <bgardon@google.com>,
kvm@vger.kernel.org
Subject: Re: A question of TDP unloading.
Date: Tue, 27 Jul 2021 18:07:35 +0000 [thread overview]
Message-ID: <YQBLZ/RrBFxE4G4w@google.com> (raw)
In-Reply-To: <20210727161957.lxevvmy37azm2h7z@linux.intel.com>
On Wed, Jul 28, 2021, Yu Zhang wrote:
> Hi all,
>
> I'd like to ask a question about kvm_reset_context(): is there any
> reason that we must alway unload TDP root in kvm_mmu_reset_context()?
The short answer is that mmu_role is changing, thus a new root shadow page is
needed.
> As you know, KVM MMU needs to track guest paging mode changes, to
> recalculate the mmu roles and reset callback routines(e.g., guest
> page table walker). These are done in kvm_mmu_reset_context(). Also,
> entering SMM, cpuid updates, and restoring L1 VMM's host state will
> trigger kvm_mmu_reset_context() too.
>
> Meanwhile, another job done by kvm_mmu_reset_context() is to unload
> the KVM MMU:
>
> - For shadow & legacy TDP, it means to unload the root shadow/TDP
> page and reconstruct another one in kvm_mmu_reload(), before
> entering guest. Old shadow/TDP pages will probably be reused later,
> after future guest paging mode switches.
>
> - For TDP MMU, it is even more aggressive, all TDP pages will be
> zapped, meaning a whole new TDP page table will be recontrustred,
> with each paging mode change in the guest. I witnessed dozens of
> rebuildings of TDP when booting a Linux guest(besides the ones
> caused by memslots rearrangement).
>
> However, I am wondering, why do we need the unloading, if GPA->HPA
> relationship is not changed? And if this is not a must, could we
> find a way to refactor kvm_mmu_reset_context(), so that unloading
> of TDP root is only performed when necessary(e.g, SMM switches and
> maybe after cpuid updates which may change the level of TDP)?
>
> I tried to add a parameter in kvm_mmu_reset_context(), to make the
> unloading optional:
>
> +void kvm_mmu_reset_context(struct kvm_vcpu *vcpu, bool force_tdp_unload)
> {
> - kvm_mmu_unload(vcpu);
> + if (!tdp_enabled || force_tdp_unload)
> + kvm_mmu_unload(vcpu);
> +
> kvm_init_mmu(vcpu);
> }
>
> But this change brings another problem - if we keep the TDP root, the
> role of existing SPs will be obsolete after guest paging mode changes.
> Altough I guess most role flags are irrelevant in TDP, I am not sure
> if this could cause any trouble.
>
> Is there anyone looking at this issue? Or do you have any suggestion?
What's the problem you're trying to solve? kvm_mmu_reset_context() is most
definitely a big hammer, e.g. kvm_post_set_cr0() and kvm_post_set_cr4() in
particular could be reworked to do something like kvm_mmu_new_pgd() + kvm_init_mmu(),
but modifying mmu_role bits in CR0/CR4 should be a rare event, i.e. there hasn't
sufficient motivation to optimize CR0/CR4 changes.
Note, most CR4 bits and CR0.PG are tracked in kvm_mmu_extended_role, not
kvm_mmu_page_role, which adds a minor wrinkle to the logic.
next prev parent reply other threads:[~2021-07-27 18:07 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-27 16:19 A question of TDP unloading Yu Zhang
2021-07-27 18:07 ` Sean Christopherson [this message]
2021-07-28 6:56 ` Yu Zhang
2021-07-28 7:25 ` Yan Zhao
2021-07-28 16:23 ` Ben Gardon
2021-07-28 17:23 ` Yu Zhang
2021-07-28 17:55 ` Ben Gardon
2021-07-29 3:00 ` Yu Zhang
2021-07-29 2:58 ` Yan Zhao
2021-07-29 5:17 ` Yu Zhang
2021-07-29 5:17 ` Yan Zhao
2021-07-29 6:34 ` Yan Zhao
2021-07-29 8:48 ` Yan Zhao
2021-07-29 20:40 ` Sean Christopherson
2021-07-29 9:19 ` Paolo Bonzini
2021-07-29 16:38 ` Yu Zhang
2021-07-28 18:37 ` Sean Christopherson
2021-07-29 3:22 ` Yu Zhang
2021-07-29 21:04 ` Sean Christopherson
2021-07-30 2:42 ` Yu Zhang
2021-07-30 9:42 ` Yu Zhang
2021-07-30 8:22 ` Yu Zhang
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=YQBLZ/RrBFxE4G4w@google.com \
--to=seanjc@google.com \
--cc=bgardon@google.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=yu.c.zhang@linux.intel.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