lkml.org 
[lkml]   [2022]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v3 2/3] KVM: x86/mmu: Expand quadrant comment for PG_LEVEL_4K shadow pages
    From
    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>
    ---
    arch/x86/kvm/mmu/mmu.c | 15 +++++++++++----
    1 file changed, 11 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
    index 864a32f96082..7a65e57b9b41 100644
    --- a/arch/x86/kvm/mmu/mmu.c
    +++ b/arch/x86/kvm/mmu/mmu.c
    @@ -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);
    --
    2.37.0.144.g8ac04bfd2-goog
    \
     
     \ /
      Last update: 2022-07-12 04:08    [W:3.031 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site