[PATCH 2/3] drm/ttm, drm/xe: Modify the struct ttm_bo_lru_walk_cursor initialization
Christian König
christian.koenig at amd.com
Mon Jun 16 13:15:14 UTC 2025
On 6/13/25 17:18, Thomas Hellström wrote:
> Instead of the struct ttm_operation_ctx, Pass a struct ttm_lru_walk_arg
> to enable us to easily extend the walk functionality, and to
> implement ttm_lru_walk_for_evict() using the guarded LRU iteration.
>
> Signed-off-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/ttm/ttm_bo_util.c | 10 +++++-----
> drivers/gpu/drm/xe/xe_shrinker.c | 3 ++-
> include/drm/ttm/ttm_bo.h | 16 ++++++++--------
> 3 files changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 600145cdeb9c..62b76abac578 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -956,11 +956,11 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
> * ttm_bo_lru_cursor_init() - Initialize a struct ttm_bo_lru_cursor
> * @curs: The ttm_bo_lru_cursor to initialize.
> * @man: The ttm resource_manager whose LRU lists to iterate over.
> - * @ctx: The ttm_operation_ctx to govern the locking.
> + * @arg: The ttm_lru_walk_arg to govern the walk.
> *
> * Initialize a struct ttm_bo_lru_cursor. Currently only trylocking
> * or prelocked buffer objects are available as detailed by
> - * @ctx::resv and @ctx::allow_res_evict. Ticketlocking is not
> + * @arg->ctx.resv and @arg->ctx.allow_res_evict. Ticketlocking is not
> * supported.
> *
> * Return: Pointer to @curs. The function does not fail.
> @@ -968,11 +968,11 @@ EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
> struct ttm_bo_lru_cursor *
> ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
> struct ttm_resource_manager *man,
> - struct ttm_operation_ctx *ctx)
> + struct ttm_lru_walk_arg *arg)
> {
> memset(curs, 0, sizeof(*curs));
> ttm_resource_cursor_init(&curs->res_curs, man);
> - curs->arg.ctx = ctx;
> + curs->arg = arg;
>
> return curs;
> }
> @@ -983,7 +983,7 @@ ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *cur
> {
> struct ttm_buffer_object *bo = res->bo;
>
> - if (!ttm_lru_walk_trylock(&curs->arg, bo, &curs->needs_unlock))
> + if (!ttm_lru_walk_trylock(curs->arg, bo, &curs->needs_unlock))
> return NULL;
>
> if (!ttm_bo_get_unless_zero(bo)) {
> diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
> index 125c836e0ee4..f8a1129da2c3 100644
> --- a/drivers/gpu/drm/xe/xe_shrinker.c
> +++ b/drivers/gpu/drm/xe/xe_shrinker.c
> @@ -66,11 +66,12 @@ static s64 xe_shrinker_walk(struct xe_device *xe,
> struct ttm_resource_manager *man = ttm_manager_type(&xe->ttm, mem_type);
> struct ttm_bo_lru_cursor curs;
> struct ttm_buffer_object *ttm_bo;
> + struct ttm_lru_walk_arg arg = {.ctx = ctx};
>
> if (!man || !man->use_tt)
> continue;
>
> - ttm_bo_lru_for_each_reserved_guarded(&curs, man, ctx, ttm_bo) {
> + ttm_bo_lru_for_each_reserved_guarded(&curs, man, &arg, ttm_bo) {
> if (!ttm_bo_shrink_suitable(ttm_bo, ctx))
> continue;
>
> diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
> index 4e52283e5db1..8f04fa48b332 100644
> --- a/include/drm/ttm/ttm_bo.h
> +++ b/include/drm/ttm/ttm_bo.h
> @@ -484,8 +484,8 @@ struct ttm_bo_lru_cursor {
> * unlock before the next iteration or after loop exit.
> */
> bool needs_unlock;
> - /** @arg: Common BO LRU walk arguments. */
> - struct ttm_lru_walk_arg arg;
> + /** @arg: Pointer to common BO LRU walk arguments. */
> + struct ttm_lru_walk_arg *arg;
> };
>
> void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);
> @@ -493,7 +493,7 @@ void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);
> struct ttm_bo_lru_cursor *
> ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
> struct ttm_resource_manager *man,
> - struct ttm_operation_ctx *ctx);
> + struct ttm_lru_walk_arg *arg);
>
> struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs);
>
> @@ -504,9 +504,9 @@ struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs)
> */
> DEFINE_CLASS(ttm_bo_lru_cursor, struct ttm_bo_lru_cursor *,
> if (_T) {ttm_bo_lru_cursor_fini(_T); },
> - ttm_bo_lru_cursor_init(curs, man, ctx),
> + ttm_bo_lru_cursor_init(curs, man, arg),
> struct ttm_bo_lru_cursor *curs, struct ttm_resource_manager *man,
> - struct ttm_operation_ctx *ctx);
> + struct ttm_lru_walk_arg *arg);
> static inline void *
> class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
> { return *_T; }
> @@ -517,7 +517,7 @@ class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
> * resources on LRU lists.
> * @_cursor: struct ttm_bo_lru_cursor to use for the iteration.
> * @_man: The resource manager whose LRU lists to iterate over.
> - * @_ctx: The struct ttm_operation_context to govern the @_bo locking.
> + * @_arg: The struct ttm_lru_walk_arg to govern the LRU walk.
> * @_bo: The struct ttm_buffer_object pointer pointing to the buffer object
> * for the current iteration.
> *
> @@ -530,8 +530,8 @@ class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
> * example a return or break statement. Exiting the loop will also unlock
> * (if needed) and unreference @_bo.
> */
> -#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _ctx, _bo) \
> - scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _ctx) \
> +#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _arg, _bo) \
> + scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _arg) \
> for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo); \
> (_bo) = ttm_bo_lru_cursor_next(_cursor))
>
More information about the Intel-xe
mailing list