static void drm_gem_remove_prime_handles(struct drm_gem_object *obj, struct drm_file *filp) { if (obj->import_attach) { drm_prime_remove_imported_buf_handle(&filp->prime, obj->import_attach->dmabuf); } if (obj->export_dma_buf) { drm_prime_remove_imported_buf_handle(&filp->prime, obj->export_dma_buf); } }
static void drm_gem_remove_prime_handles(struct drm_gem_object *obj, struct drm_file *filp) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) if (obj->import_attach) { drm_prime_remove_imported_buf_handle(&filp->prime, obj->import_attach->dmabuf); } if (obj->export_dma_buf) { drm_prime_remove_imported_buf_handle(&filp->prime, obj->export_dma_buf); } #endif }
static int drm_gem_object_release_handle(int id, void *ptr, void *data) { struct drm_file *file_priv = data; struct drm_gem_object *obj = ptr; struct drm_device *dev = obj->dev; if (obj->import_attach) drm_prime_remove_imported_buf_handle(&file_priv->prime, obj->import_attach->dmabuf); if (dev->driver->gem_close_object) dev->driver->gem_close_object(obj, file_priv); drm_gem_object_handle_unreference_unlocked(obj); return 0; }
int drm_gem_handle_delete(struct drm_file *filp, u32 handle) { struct drm_device *dev; struct drm_gem_object *obj; /* */ spin_lock(&filp->table_lock); /* */ obj = idr_find(&filp->object_idr, handle); if (obj == NULL) { spin_unlock(&filp->table_lock); return -EINVAL; } dev = obj->dev; /* */ idr_remove(&filp->object_idr, handle); spin_unlock(&filp->table_lock); if (obj->import_attach) drm_prime_remove_imported_buf_handle(&filp->prime, obj->import_attach->dmabuf); if (dev->driver->gem_close_object) dev->driver->gem_close_object(obj, filp); drm_gem_object_handle_unreference_unlocked(obj); return 0; }
/** * Removes the mapping from handle to filp for this object. */ int drm_gem_handle_delete(struct drm_file *filp, u32 handle) { struct drm_device *dev; struct drm_gem_object *obj; /* This is gross. The idr system doesn't let us try a delete and * return an error code. It just spews if you fail at deleting. * So, we have to grab a lock around finding the object and then * doing the delete on it and dropping the refcount, or the user * could race us to double-decrement the refcount and cause a * use-after-free later. Given the frequency of our handle lookups, * we may want to use ida for number allocation and a hash table * for the pointers, anyway. */ spin_lock(&filp->table_lock); /* Check if we currently have a reference on the object */ obj = idr_find(&filp->object_idr, handle); if (obj == NULL) { spin_unlock(&filp->table_lock); return -EINVAL; } dev = obj->dev; /* Release reference and decrement refcount. */ idr_remove(&filp->object_idr, handle); spin_unlock(&filp->table_lock); if (obj->import_attach) drm_prime_remove_imported_buf_handle(&filp->prime, obj->import_attach->dmabuf); if (dev->driver->gem_close_object) dev->driver->gem_close_object(obj, filp); drm_gem_object_handle_unreference_unlocked(obj); return 0; }