• Chris Wilson's avatar
    drm: Release driver references to handle before making it available again · f6cd7dae
    Chris Wilson authored
    When userspace closes a handle, we remove it from the file->object_idr
    and then tell the driver to drop its references to that file/handle.
    However, as the file/handle is already available again for reuse, it may
    be reallocated back to userspace and active on a new object before the
    driver has had a chance to drop the old file/handle references.
    
    Whilst calling back into the driver, we have to drop the
    file->table_lock spinlock and so to prevent reusing the closed handle we
    mark that handle as stale in the idr, perform the callback and then
    remove the handle. We set the stale handle to point to the NULL object,
    then any idr_find() whilst the driver is removing the handle will return
    NULL, just as if the handle is already removed from idr.
    
    Note: This will be used to have a direct handle -> vma lookup table,
    instead of first a handle -> obj lookup, and then an (obj, vm) -> vma
    lookup.
    
    v2: Use NULL rather than an ERR_PTR to avoid having to adjust callers.
    idr_alloc() tracks existing handles using an internal bitmap, so we are
    free to use the NULL object as our stale identifier.
    v3: Needed to update the return value check after changing from using
    the stale error pointer to NULL.
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: dri-devel@lists.freedesktop.org
    Cc: David Airlie <airlied@linux.ie>
    Cc: Daniel Vetter <daniel.vetter@intel.com>
    Cc: Rob Clark <robdclark@gmail.com>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Cc: Thierry Reding <treding@nvidia.com>
    [danvet: Add note about the use-case.]
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Link: http://patchwork.freedesktop.org/patch/msgid/1460721308-32405-1-git-send-email-chris@chris-wilson.co.uk
    f6cd7dae
drm_gem.c 27.1 KB