• Nicholas Piggin's avatar
    KVM: PPC: Book3S HV: Recursively unmap all page table entries when unmapping · a5704e83
    Nicholas Piggin authored
    When partition scope mappings are unmapped with kvm_unmap_radix, the
    pte is cleared, but the page table structure is left in place. If the
    next page fault requests a different page table geometry (e.g., due to
    THP promotion or split), kvmppc_create_pte is responsible for changing
    the page tables.
    
    When a page table entry is to be converted to a large pte, the page
    table entry is cleared, the PWC flushed, then the page table it points
    to freed. This will cause pte page tables to leak when a 1GB page is
    to replace a pud entry points to a pmd table with pte tables under it:
    The pmd table will be freed, but its pte tables will be missed.
    
    Fix this by replacing the simple clear and free code with one that
    walks down the page tables and frees children. Care must be taken to
    clear the root entry being unmapped then flushing the PWC before
    freeing any page tables, as explained in comments.
    
    This requires PWC flush to logically become a flush-all-PWC (which it
    already is in hardware, but the KVM API needs to be changed to avoid
    confusion).
    
    This code also checks that no unexpected pte entries exist in any page
    table being freed, and unmaps those and emits a WARN. This is an
    expensive operation for the pte page level, but partition scope
    changes are rare, so it's unconditional for now to iron out bugs. It
    can be put under a CONFIG option or removed after some time.
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
    a5704e83
book3s_64_mmu_radix.c 22.7 KB