Commit 89c815ef authored by Thomas Zimmermann's avatar Thomas Zimmermann Committed by Alex Deucher

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: default avatarThomas Zimmermann <contact@tzimmermann.org>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 31e1c597
...@@ -587,12 +587,18 @@ static void ttm_bo_release(struct kref *kref) ...@@ -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 { ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment