• Ben Gardon's avatar
    KVM: x86/MMU: Recursively zap nested TDP SPs when zapping last/only parent · 2de4085c
    Ben Gardon authored
    Recursively zap all to-be-orphaned children, unsynced or otherwise, when
    zapping a shadow page for a nested TDP MMU.  KVM currently only zaps the
    unsynced child pages, but not the synced ones.  This can create problems
    over time when running many nested guests because it leaves unlinked
    pages which will not be freed until the page quota is hit. With the
    default page quota of 20 shadow pages per 1000 guest pages, this looks
    like a memory leak and can degrade MMU performance.
    
    In a recent benchmark, substantial performance degradation was observed:
    An L1 guest was booted with 64G memory.
    2G nested Windows guests were booted, 10 at a time for 20
    iterations. (200 total boots)
    Windows was used in this benchmark because they touch all of their
    memory on startup.
    By the end of the benchmark, the nested guests were taking ~10% longer
    to boot. With this patch there is no degradation in boot time.
    Without this patch the benchmark ends with hundreds of thousands of
    stale EPT02 pages cluttering up rmaps and the page hash map. As a
    result, VM shutdown is also much slower: deleting memslot 0 was
    observed to take over a minute. With this patch it takes just a
    few miliseconds.
    
    Cc: Peter Shier <pshier@google.com>
    Signed-off-by: default avatarBen Gardon <bgardon@google.com>
    Co-developed-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Message-Id: <20200923221406.16297-3-sean.j.christopherson@intel.com>
    Reviewed-by: default avatarBen Gardon <bgardon@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    2de4085c
mmu.c 170 KB