• Ricardo Koller's avatar
    KVM: arm64: Split huge pages when dirty logging is enabled · e7bf7a49
    Ricardo Koller authored
    Split huge pages eagerly when enabling dirty logging. The goal is to
    avoid doing it while faulting on write-protected pages, which
    negatively impacts guest performance.
    
    A memslot marked for dirty logging is split in 1GB pieces at a time.
    This is in order to release the mmu_lock and give other kernel threads
    the opportunity to run, and also in order to allocate enough pages to
    split a 1GB range worth of huge pages (or a single 1GB huge page).
    Note that these page allocations can fail, so eager page splitting is
    best-effort.  This is not a correctness issue though, as huge pages
    can still be split on write-faults.
    
    Eager page splitting only takes effect when the huge page mapping has
    been existing in the stage-2 page table. Otherwise, the huge page will
    be mapped to multiple non-huge pages on page fault.
    
    The benefits of eager page splitting are the same as in x86, added
    with commit a3fe5dbd ("KVM: x86/mmu: Split huge pages mapped by
    the TDP MMU when dirty logging is enabled"). For example, when running
    dirty_log_perf_test with 64 virtual CPUs (Ampere Altra), 1GB per vCPU,
    50% reads, and 2MB HugeTLB memory, the time it takes vCPUs to access
    all of their memory after dirty logging is enabled decreased by 44%
    from 2.58s to 1.42s.
    Signed-off-by: default avatarRicardo Koller <ricarkol@google.com>
    Reviewed-by: default avatarShaoqin Huang <shahuang@redhat.com>
    Reviewed-by: default avatarGavin Shan <gshan@redhat.com>
    Link: https://lore.kernel.org/r/20230426172330.1439644-10-ricarkol@google.comSigned-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
    e7bf7a49
mmu.c 55.7 KB