drm/vmwgfx: Look up user buffer objects without taking a reference
Identically to how we look up ttm base objects witout reference, provide the same functionality to vmw user buffer objects which derive from them. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Sinclair Yeh <syeh@vmware.com>
This commit is contained in:
@@ -921,6 +921,47 @@ int vmw_user_bo_lookup(struct ttm_object_file *tfile,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vmw_user_bo_noref_lookup - Look up a vmw user buffer object without reference
|
||||||
|
* @tfile: The TTM object file the handle is registered with.
|
||||||
|
* @handle: The user buffer object handle.
|
||||||
|
*
|
||||||
|
* This function looks up a struct vmw_user_bo and returns a pointer to the
|
||||||
|
* struct vmw_buffer_object it derives from without refcounting the pointer.
|
||||||
|
* The returned pointer is only valid until vmw_user_bo_noref_release() is
|
||||||
|
* called, and the object pointed to by the returned pointer may be doomed.
|
||||||
|
* Any persistent usage of the object requires a refcount to be taken using
|
||||||
|
* ttm_bo_reference_unless_doomed(). Iff this function returns successfully it
|
||||||
|
* needs to be paired with vmw_user_bo_noref_release() and no sleeping-
|
||||||
|
* or scheduling functions may be called inbetween these function calls.
|
||||||
|
*
|
||||||
|
* Return: A struct vmw_buffer_object pointer if successful or negative
|
||||||
|
* error pointer on failure.
|
||||||
|
*/
|
||||||
|
struct vmw_buffer_object *
|
||||||
|
vmw_user_bo_noref_lookup(struct ttm_object_file *tfile, u32 handle)
|
||||||
|
{
|
||||||
|
struct vmw_user_buffer_object *vmw_user_bo;
|
||||||
|
struct ttm_base_object *base;
|
||||||
|
|
||||||
|
base = ttm_base_object_noref_lookup(tfile, handle);
|
||||||
|
if (!base) {
|
||||||
|
DRM_ERROR("Invalid buffer object handle 0x%08lx.\n",
|
||||||
|
(unsigned long)handle);
|
||||||
|
return ERR_PTR(-ESRCH);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unlikely(ttm_base_object_type(base) != ttm_buffer_type)) {
|
||||||
|
ttm_base_object_noref_release();
|
||||||
|
DRM_ERROR("Invalid buffer object handle 0x%08lx.\n",
|
||||||
|
(unsigned long)handle);
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
vmw_user_bo = container_of(base, struct vmw_user_buffer_object,
|
||||||
|
prime.base);
|
||||||
|
return &vmw_user_bo->vbo;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vmw_user_bo_reference - Open a handle to a vmw user buffer object.
|
* vmw_user_bo_reference - Open a handle to a vmw user buffer object.
|
||||||
|
@@ -772,6 +772,18 @@ extern void vmw_bo_unmap(struct vmw_buffer_object *vbo);
|
|||||||
extern void vmw_bo_move_notify(struct ttm_buffer_object *bo,
|
extern void vmw_bo_move_notify(struct ttm_buffer_object *bo,
|
||||||
struct ttm_mem_reg *mem);
|
struct ttm_mem_reg *mem);
|
||||||
extern void vmw_bo_swap_notify(struct ttm_buffer_object *bo);
|
extern void vmw_bo_swap_notify(struct ttm_buffer_object *bo);
|
||||||
|
extern struct vmw_buffer_object *
|
||||||
|
vmw_user_bo_noref_lookup(struct ttm_object_file *tfile, u32 handle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vmw_user_bo_noref_release - release a buffer object pointer looked up
|
||||||
|
* without reference
|
||||||
|
*/
|
||||||
|
static inline void vmw_user_bo_noref_release(void)
|
||||||
|
{
|
||||||
|
ttm_base_object_noref_release();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Misc Ioctl functionality - vmwgfx_ioctl.c
|
* Misc Ioctl functionality - vmwgfx_ioctl.c
|
||||||
|
Reference in New Issue
Block a user