• Alexey Kardashevskiy's avatar
    powerpc/mmu: Add userspace-to-physical addresses translation cache · 15b244a8
    Alexey Kardashevskiy authored
    We are adding support for DMA memory pre-registration to be used in
    conjunction with VFIO. The idea is that the userspace which is going to
    run a guest may want to pre-register a user space memory region so
    it all gets pinned once and never goes away. Having this done,
    a hypervisor will not have to pin/unpin pages on every DMA map/unmap
    request. This is going to help with multiple pinning of the same memory.
    
    Another use of it is in-kernel real mode (mmu off) acceleration of
    DMA requests where real time translation of guest physical to host
    physical addresses is non-trivial and may fail as linux ptes may be
    temporarily invalid. Also, having cached host physical addresses
    (compared to just pinning at the start and then walking the page table
    again on every H_PUT_TCE), we can be sure that the addresses which we put
    into TCE table are the ones we already pinned.
    
    This adds a list of memory regions to mm_context_t. Each region consists
    of a header and a list of physical addresses. This adds API to:
    1. register/unregister memory regions;
    2. do final cleanup (which puts all pre-registered pages);
    3. do userspace to physical address translation;
    4. manage usage counters; multiple registration of the same memory
    is allowed (once per container).
    
    This implements 2 counters per registered memory region:
    - @mapped: incremented on every DMA mapping; decremented on unmapping;
    initialized to 1 when a region is just registered; once it becomes zero,
    no more mappings allowe;
    - @used: incremented on every "register" ioctl; decremented on
    "unregister"; unregistration is allowed for DMA mapped regions unless
    it is the very last reference. For the very last reference this checks
    that the region is still mapped and returns -EBUSY so the userspace
    gets to know that memory is still pinned and unregistration needs to
    be retried; @used remains 1.
    
    Host physical addresses are stored in vmalloc'ed array. In order to
    access these in the real mode (mmu off), there is a real_vmalloc_addr()
    helper. In-kernel acceleration patchset will move it from KVM to MMU code.
    Signed-off-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
    Reviewed-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    Reviewed-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    15b244a8
mmu_context_iommu.c 6.61 KB