• Peter Xu's avatar
    KVM: X86: Implement ring-based dirty memory tracking · fb04a1ed
    Peter Xu authored
    This patch is heavily based on previous work from Lei Cao
    <lei.cao@stratus.com> and Paolo Bonzini <pbonzini@redhat.com>. [1]
    
    KVM currently uses large bitmaps to track dirty memory.  These bitmaps
    are copied to userspace when userspace queries KVM for its dirty page
    information.  The use of bitmaps is mostly sufficient for live
    migration, as large parts of memory are be dirtied from one log-dirty
    pass to another.  However, in a checkpointing system, the number of
    dirty pages is small and in fact it is often bounded---the VM is
    paused when it has dirtied a pre-defined number of pages. Traversing a
    large, sparsely populated bitmap to find set bits is time-consuming,
    as is copying the bitmap to user-space.
    
    A similar issue will be there for live migration when the guest memory
    is huge while the page dirty procedure is trivial.  In that case for
    each dirty sync we need to pull the whole dirty bitmap to userspace
    and analyse every bit even if it's mostly zeros.
    
    The preferred data structure for above scenarios is a dense list of
    guest frame numbers (GFN).  This patch series stores the dirty list in
    kernel memory that can be memory mapped into userspace to allow speedy
    harvesting.
    
    This patch enables dirty ring for X86 only.  However it should be
    easily extended to other archs as well.
    
    [1] https://patchwork.kernel.org/patch/10471409/Signed-off-by: default avatarLei Cao <lei.cao@stratus.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
    Message-Id: <20201001012222.5767-1-peterx@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    fb04a1ed
vmx.c 222 KB