• Lai Jiangshan's avatar
    KVM: x86/mmu: Remove FNAME(is_self_change_mapping) · 9a967700
    Lai Jiangshan authored
    Drop FNAME(is_self_change_mapping) and instead rely on
    kvm_mmu_hugepage_adjust() to adjust the hugepage accordingly.  Prior to
    commit 4cd071d1 ("KVM: x86/mmu: Move calls to thp_adjust() down a
    level"), the hugepage adjustment was done before allocating new shadow
    pages, i.e. failed to restrict the hugepage sizes if a new shadow page
    resulted in account_shadowed() changing the disallowed hugepage tracking.
    
    Removing FNAME(is_self_change_mapping) fixes a bug reported by Huang Hang
    where KVM unnecessarily forces a 4KiB page.  FNAME(is_self_change_mapping)
    has a defect in that it blindly disables _all_ hugepage mappings rather
    than trying to reduce the size of the hugepage.  If the guest is writing
    to a 1GiB page and the 1GiB is self-referential but a 2MiB page is not,
    then KVM can and should create a 2MiB mapping.
    
    Add a comment above the call to kvm_mmu_hugepage_adjust() to call out the
    new dependency on adjusting the hugepage size after walking indirect PTEs.
    Reported-by: default avatarHuang Hang <hhuang@linux.alibaba.com>
    Signed-off-by: default avatarLai Jiangshan <jiangshan.ljs@antgroup.com>
    Link: https://lore.kernel.org/r/20221213125538.81209-1-jiangshanlai@gmail.com
    [sean: rework changelog after separating out the emulator change]
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20230202182817.407394-4-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    9a967700
paging_tmpl.h 30.2 KB