• Alexey Kardashevskiy's avatar
    vfio/spapr: Reference mm in tce_container · bc82d122
    Alexey Kardashevskiy authored
    In some situations the userspace memory context may live longer than
    the userspace process itself so if we need to do proper memory context
    cleanup, we better have tce_container take a reference to mm_struct and
    use it later when the process is gone (@current or @current->mm is NULL).
    
    This references mm and stores the pointer in the container; this is done
    in a new helper - tce_iommu_mm_set() - when one of the following happens:
    - a container is enabled (IOMMU v1);
    - a first attempt to pre-register memory is made (IOMMU v2);
    - a DMA window is created (IOMMU v2).
    The @mm stays referenced till the container is destroyed.
    
    This replaces current->mm with container->mm everywhere except debug
    prints.
    
    This adds a check that current->mm is the same as the one stored in
    the container to prevent userspace from making changes to a memory
    context of other processes.
    
    DMA map/unmap ioctls() do not check for @mm as they already check
    for @enabled which is set after tce_iommu_mm_set() is called.
    
    This does not reference a task as multiple threads within the same mm
    are allowed to ioctl() to vfio and supposedly they will have same limits
    and capabilities and if they do not, we'll just fail with no harm made.
    Signed-off-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
    Acked-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    Reviewed-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    bc82d122
vfio_iommu_spapr_tce.c 30.9 KB