• David Herrmann's avatar
    drm/vma: add access management helpers · 88d7ebe5
    David Herrmann authored
    The VMA offset manager uses a device-global address-space. Hence, any
    user can currently map any offset-node they want. They only need to guess
    the right offset. If we wanted per open-file offset spaces, we'd either
    need VM_NONLINEAR mappings or multiple "struct address_space" trees. As
    both doesn't really scale, we implement access management in the VMA
    manager itself.
    
    We use an rb-tree to store open-files for each VMA node. On each mmap
    call, GEM, TTM or the drivers must check whether the current user is
    allowed to map this file.
    
    We add a separate lock for each node as there is no generic lock available
    for the caller to protect the node easily.
    
    As we currently don't know whether an object may be used for mmap(), we
    have to do access management for all objects. If it turns out to slow down
    handle creation/deletion significantly, we can optimize it in several
    ways:
     - Most times only a single filp is added per bo so we could use a static
       "struct file *main_filp" which is checked/added/removed first before we
       fall back to the rbtree+drm_vma_offset_file.
       This could be even done lockless with rcu.
     - Let user-space pass a hint whether mmap() should be supported on the
       bo and avoid access-management if not.
     - .. there are probably more ideas once we have benchmarks ..
    
    v2: add drm_vma_node_verify_access() helper
    Signed-off-by: default avatarDavid Herrmann <dh.herrmann@gmail.com>
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    88d7ebe5
drm_vma_manager.c 13.7 KB