kvm: x86/mmu: Warn on linking when sp->unsync_children
authorLai Jiangshan <jiangshan.ljs@antgroup.com>
Mon, 12 Dec 2022 09:01:06 +0000 (17:01 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 29 Dec 2022 20:33:13 +0000 (15:33 -0500)
Since the commit 65855ed8b034 ("KVM: X86: Synchronize the shadow
pagetable before link it"), no sp would be linked with
sp->unsync_children = 1.

So make it WARN if it is the case.

Signed-off-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Message-Id: <20221212090106.378206-1-jiangshanlai@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/mmu/mmu.c

index 4736d78..26b32ae 100644 (file)
@@ -2355,7 +2355,16 @@ static void __link_shadow_page(struct kvm *kvm,
 
        mmu_page_add_parent_pte(cache, sp, sptep);
 
-       if (sp->unsync_children || sp->unsync)
+       /*
+        * The non-direct sub-pagetable must be updated before linking.  For
+        * L1 sp, the pagetable is updated via kvm_sync_page() in
+        * kvm_mmu_find_shadow_page() without write-protecting the gfn,
+        * so sp->unsync can be true or false.  For higher level non-direct
+        * sp, the pagetable is updated/synced via mmu_sync_children() in
+        * FNAME(fetch)(), so sp->unsync_children can only be false.
+        * WARN_ON_ONCE() if anything happens unexpectedly.
+        */
+       if (WARN_ON_ONCE(sp->unsync_children) || sp->unsync)
                mark_unsync(sptep);
 }