mirror of https://gitee.com/openkylin/linux.git
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:
parent
64ad2abfe9
commit
b733bc2e0a
|
@ -921,6 +921,47 @@ int vmw_user_bo_lookup(struct ttm_object_file *tfile,
|
|||
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.
|
||||
|
|
|
@ -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,
|
||||
struct ttm_mem_reg *mem);
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue