]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: x86/mmu: Expand quadrant comment for PG_LEVEL_4K shadow pages
authorSean Christopherson <seanjc@google.com>
Tue, 12 Jul 2022 02:07:23 +0000 (02:07 +0000)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 14 Jul 2022 15:31:24 +0000 (11:31 -0400)
Tweak the comment above the computation of the quadrant for PG_LEVEL_4K
shadow pages to explicitly call out how and why KVM uses role.quadrant to
consume gPTE bits.

Opportunistically wrap an unnecessarily long line.

No functional change intended.

Link: https://lore.kernel.org/all/YqvWvBv27fYzOFdE@google.com
Reviewed-by: David Matlack <dmatlack@google.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220712020724.1262121-3-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/mmu/mmu.c

index 864a32f96082934c537af90a44a87544918a9fd7..7a65e57b9b415b9e6d17abd4f952065f582fc9e1 100644 (file)
@@ -2168,7 +2168,8 @@ static struct kvm_mmu_page *kvm_mmu_get_shadow_page(struct kvm_vcpu *vcpu,
        return __kvm_mmu_get_shadow_page(vcpu->kvm, vcpu, &caches, gfn, role);
 }
 
-static union kvm_mmu_page_role kvm_mmu_child_role(u64 *sptep, bool direct, unsigned int access)
+static union kvm_mmu_page_role kvm_mmu_child_role(u64 *sptep, bool direct,
+                                                 unsigned int access)
 {
        struct kvm_mmu_page *parent_sp = sptep_to_sp(sptep);
        union kvm_mmu_page_role role;
@@ -2195,9 +2196,15 @@ static union kvm_mmu_page_role kvm_mmu_child_role(u64 *sptep, bool direct, unsig
         * uses 2 PAE page tables, each mapping a 2MiB region. For these,
         * @role.quadrant encodes which half of the region they map.
         *
-        * Note, the 4 PAE page directories are pre-allocated and the quadrant
-        * assigned in mmu_alloc_root(). So only page tables need to be handled
-        * here.
+        * Concretely, a 4-byte PDE consumes bits 31:22, while an 8-byte PDE
+        * consumes bits 29:21.  To consume bits 31:30, KVM's uses 4 shadow
+        * PDPTEs; those 4 PAE page directories are pre-allocated and their
+        * quadrant is assigned in mmu_alloc_root().   A 4-byte PTE consumes
+        * bits 21:12, while an 8-byte PTE consumes bits 20:12.  To consume
+        * bit 21 in the PTE (the child here), KVM propagates that bit to the
+        * quadrant, i.e. sets quadrant to '0' or '1'.  The parent 8-byte PDE
+        * covers bit 21 (see above), thus the quadrant is calculated from the
+        * _least_ significant bit of the PDE index.
         */
        if (role.has_4_byte_gpte) {
                WARN_ON_ONCE(role.level != PG_LEVEL_4K);