drm/ttm: Introduce ttm_bo_get() and ttm_bo_put() for ref counting
The TTM buffer-object interface provides ttm_bo_reference() and ttm_bo_unref() for managing reference counts. Replacing them with ttm_bo_get() and ttm_bo_put() aligns the API with conventions used throughout the Linux kernel. The implementation of ttm_bo_unref() clears the supplied pointer to NULL. This leads to workarounds where the caller saves the pointer's value before de-referencing the BO. ttm_bo_put() does not clear the supplied pointer. Signed-off-by: Thomas Zimmermann <contact@tzimmermann.org> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
31e1c59796
commit
89c815ef07
|
@ -587,12 +587,18 @@ static void ttm_bo_release(struct kref *kref)
|
||||||
kref_put(&bo->list_kref, ttm_bo_release_list);
|
kref_put(&bo->list_kref, ttm_bo_release_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ttm_bo_put(struct ttm_buffer_object *bo)
|
||||||
|
{
|
||||||
|
kref_put(&bo->kref, ttm_bo_release);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ttm_bo_put);
|
||||||
|
|
||||||
void ttm_bo_unref(struct ttm_buffer_object **p_bo)
|
void ttm_bo_unref(struct ttm_buffer_object **p_bo)
|
||||||
{
|
{
|
||||||
struct ttm_buffer_object *bo = *p_bo;
|
struct ttm_buffer_object *bo = *p_bo;
|
||||||
|
|
||||||
*p_bo = NULL;
|
*p_bo = NULL;
|
||||||
kref_put(&bo->kref, ttm_bo_release);
|
ttm_bo_put(bo);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ttm_bo_unref);
|
EXPORT_SYMBOL(ttm_bo_unref);
|
||||||
|
|
||||||
|
|
|
@ -283,18 +283,30 @@ struct ttm_operation_ctx {
|
||||||
/* when serving page fault or suspend, allow alloc anyway */
|
/* when serving page fault or suspend, allow alloc anyway */
|
||||||
#define TTM_OPT_FLAG_FORCE_ALLOC 0x2
|
#define TTM_OPT_FLAG_FORCE_ALLOC 0x2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ttm_bo_get - reference a struct ttm_buffer_object
|
||||||
|
*
|
||||||
|
* @bo: The buffer object.
|
||||||
|
*/
|
||||||
|
static inline void ttm_bo_get(struct ttm_buffer_object *bo)
|
||||||
|
{
|
||||||
|
kref_get(&bo->kref);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ttm_bo_reference - reference a struct ttm_buffer_object
|
* ttm_bo_reference - reference a struct ttm_buffer_object
|
||||||
*
|
*
|
||||||
* @bo: The buffer object.
|
* @bo: The buffer object.
|
||||||
*
|
*
|
||||||
* Returns a refcounted pointer to a buffer object.
|
* Returns a refcounted pointer to a buffer object.
|
||||||
|
*
|
||||||
|
* This function is deprecated. Use @ttm_bo_get instead.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static inline struct ttm_buffer_object *
|
static inline struct ttm_buffer_object *
|
||||||
ttm_bo_reference(struct ttm_buffer_object *bo)
|
ttm_bo_reference(struct ttm_buffer_object *bo)
|
||||||
{
|
{
|
||||||
kref_get(&bo->kref);
|
ttm_bo_get(bo);
|
||||||
return bo;
|
return bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,12 +357,23 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
|
||||||
struct ttm_placement *placement,
|
struct ttm_placement *placement,
|
||||||
struct ttm_operation_ctx *ctx);
|
struct ttm_operation_ctx *ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ttm_bo_put
|
||||||
|
*
|
||||||
|
* @bo: The buffer object.
|
||||||
|
*
|
||||||
|
* Unreference a buffer object.
|
||||||
|
*/
|
||||||
|
void ttm_bo_put(struct ttm_buffer_object *bo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ttm_bo_unref
|
* ttm_bo_unref
|
||||||
*
|
*
|
||||||
* @bo: The buffer object.
|
* @bo: The buffer object.
|
||||||
*
|
*
|
||||||
* Unreference and clear a pointer to a buffer object.
|
* Unreference and clear a pointer to a buffer object.
|
||||||
|
*
|
||||||
|
* This function is deprecated. Use @ttm_bo_put instead.
|
||||||
*/
|
*/
|
||||||
void ttm_bo_unref(struct ttm_buffer_object **bo);
|
void ttm_bo_unref(struct ttm_buffer_object **bo);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue