Message ID | 20220521131700.3661-1-jiangshanlai@gmail.com (mailing list archive) |
---|---|
Headers | show |
Series | KVM: X86/MMU: Use one-off local shadow page for special roots | expand |
On Sat, May 21, 2022 at 9:16 PM Lai Jiangshan <jiangshanlai@gmail.com> wrote: > > From: Lai Jiangshan <jiangshan.ljs@antgroup.com> > > Current code uses mmu->pae_root, mmu->pml4_root, and mmu->pml5_root to > setup special roots. The initialization code is complex and the roots > are not associated with struct kvm_mmu_page which causes the code more > complex. > > So add new local shadow pages to simplify it. > > The local shadow pages are associated with struct kvm_mmu_page and > VCPU-local. > > The local shadow pages are created and freed when the roots are > changed (or one-off) which can be optimized but not in the patchset > since the re-creating is light way (in normal case only the struct > kvm_mmu_page needs to be re-allocated and sp->spt doens't, because > it is likely to be mmu->pae_root) > > The patchset also fixes a possible bug described in: > https://lore.kernel.org/lkml/20220415103414.86555-1-jiangshanlai@gmail.com/ > as patch1. > Ping and please ignore patch1 and patch9. It would not cause any conflict without patch1 and patch9 if both are ignored together. The fix is wrong (see new discussion in the above link). So the possible correct fix will not have any conflict with this patchset of one-off local shadow page. I don't want to add extra stuff in this patchset anymore. Thanks Lai
On Thu, May 26, 2022 at 04:49:09PM +0800, Lai Jiangshan wrote: > On Sat, May 21, 2022 at 9:16 PM Lai Jiangshan <jiangshanlai@gmail.com> wrote: > > > > From: Lai Jiangshan <jiangshan.ljs@antgroup.com> > > > > Current code uses mmu->pae_root, mmu->pml4_root, and mmu->pml5_root to > > setup special roots. The initialization code is complex and the roots > > are not associated with struct kvm_mmu_page which causes the code more > > complex. > > > > So add new local shadow pages to simplify it. > > > > The local shadow pages are associated with struct kvm_mmu_page and > > VCPU-local. > > > > The local shadow pages are created and freed when the roots are > > changed (or one-off) which can be optimized but not in the patchset > > since the re-creating is light way (in normal case only the struct > > kvm_mmu_page needs to be re-allocated and sp->spt doens't, because > > it is likely to be mmu->pae_root) > > > > The patchset also fixes a possible bug described in: > > https://lore.kernel.org/lkml/20220415103414.86555-1-jiangshanlai@gmail.com/ > > as patch1. > > > > Ping and please ignore patch1 and patch9. It would not cause any conflict > without patch1 and patch9 if both are ignored together. > > The fix is wrong (see new discussion in the above link). So the possible > correct fix will not have any conflict with this patchset of one-off > local shadow page. I don't want to add extra stuff in this patchset > anymore. Yeah I agree with splitting this fix out to a separate patchset, and ordered after this cleanup so it can be done in one patch. When you get around to it, can you also implement a kvm-unit-test to demonstrate the bug? It would be good to have a regression test. > > Thanks > Lai
From: Lai Jiangshan <jiangshan.ljs@antgroup.com> Current code uses mmu->pae_root, mmu->pml4_root, and mmu->pml5_root to setup special roots. The initialization code is complex and the roots are not associated with struct kvm_mmu_page which causes the code more complex. So add new local shadow pages to simplify it. The local shadow pages are associated with struct kvm_mmu_page and VCPU-local. The local shadow pages are created and freed when the roots are changed (or one-off) which can be optimized but not in the patchset since the re-creating is light way (in normal case only the struct kvm_mmu_page needs to be re-allocated and sp->spt doens't, because it is likely to be mmu->pae_root) The patchset also fixes a possible bug described in: https://lore.kernel.org/lkml/20220415103414.86555-1-jiangshanlai@gmail.com/ as patch1. And the fixing is simplifed in patch9 with the help of local shadow page. Note: using_local_root_page() can be implemented in two ways. static bool using_local_root_page(struct kvm_mmu *mmu) { return mmu->root_role.level == PT32E_ROOT_LEVEL || (!mmu->root_role.direct && mmu->cpu_role.base.level <= PT32E_ROOT_LEVEL); } static bool using_local_root_page(struct kvm_mmu *mmu) { if (mmu->root_role.direct) return mmu->root_role.level == PT32E_ROOT_LEVEL; else return mmu->cpu_role.base.level <= PT32E_ROOT_LEVEL; } I prefer the second way. But when I wrote the documents for them. I couldn't explain well enough for the second way. Maybe I explained the second way in a wrong aspect or my English is not qualified to explain it. So I put the first way in patch 2 and the second way in patch3. Patch3 adds much more documents and changes the first way to the second way. Patch3 can be discarded. Changed from v2: Add document for using_local_root_page() Update many documents Address review comments Add a patch that fix a possible bug (and split other patches for patch9) Changed from v1: Rebase to newest kvm/queue. Slightly update patch4. [V2]: https://lore.kernel.org/lkml/20220503150735.32723-1-jiangshanlai@gmail.com/ [V1]: https://lore.kernel.org/lkml/20220420132605.3813-1-jiangshanlai@gmail.com/ Lai Jiangshan (12): KVM: X86/MMU: Verify PDPTE for nested NPT in PAE paging mode when page fault KVM: X86/MMU: Add using_local_root_page() KVM: X86/MMU: Reduce a check in using_local_root_page() for common cases KVM: X86/MMU: Add local shadow pages KVM: X86/MMU: Link PAE root pagetable with its children KVM: X86/MMU: Activate local shadow pages and remove old logic KVM: X86/MMU: Remove the check of the return value of to_shadow_page() KVM: X86/MMU: Allocate mmu->pae_root for PAE paging on-demand KVM: X86/MMU: Move the verifying of NPT's PDPTE in FNAME(fetch) KVM: X86/MMU: Remove unused INVALID_PAE_ROOT and IS_VALID_PAE_ROOT KVM: X86/MMU: Don't use mmu->pae_root when shadowing PAE NPT in 64-bit host KVM: X86/MMU: Remove mmu_alloc_special_roots() arch/x86/include/asm/kvm_host.h | 5 +- arch/x86/kvm/mmu/mmu.c | 575 ++++++++++++++------------------ arch/x86/kvm/mmu/mmu_internal.h | 10 - arch/x86/kvm/mmu/paging_tmpl.h | 51 ++- arch/x86/kvm/mmu/spte.c | 7 + arch/x86/kvm/mmu/spte.h | 1 + arch/x86/kvm/mmu/tdp_mmu.h | 7 +- arch/x86/kvm/x86.c | 4 +- 8 files changed, 303 insertions(+), 357 deletions(-)