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.hellst...@linux.intel.com>
Reviewed-by: Christian König <christian.koe...@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)) >