Allow specifying a drm_exec object in TTMs operation context which is used to lock objects during eviction.
This allows to handle deadlocks much more gracefully and with that avoid returning -ENOMEM on heavily contended domains. v2: rebased on top of Thomas work v3: rebased again v4: adjust to dma_resv changes Signed-off-by: Christian König <[email protected]> --- drivers/gpu/drm/ttm/ttm_bo_util.c | 12 ++++++++---- include/drm/ttm/ttm_bo.h | 5 +++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 1bdd69643c313..570640ae79d84 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -38,6 +38,7 @@ #include <drm/ttm/ttm_tt.h> #include <drm/drm_cache.h> +#include <drm/drm_exec.h> struct ttm_transfer_obj { struct ttm_buffer_object base; @@ -839,7 +840,9 @@ static int ttm_lru_walk_ticketlock(struct ttm_bo_lru_cursor *curs, struct ttm_lru_walk_arg *arg = curs->arg; int ret; - if (arg->ctx->interruptible) + if (arg->ctx->exec) + ret = drm_exec_lock_resv(arg->ctx->exec, resv); + else if (arg->ctx->interruptible) ret = dma_resv_lock_interruptible(resv, arg->ticket); else ret = dma_resv_lock(resv, arg->ticket); @@ -853,7 +856,8 @@ static int ttm_lru_walk_ticketlock(struct ttm_bo_lru_cursor *curs, * trylocking for this walk. */ arg->ticket = NULL; - } else if (ret == -EDEADLK) { + + } else if (!arg->ctx->exec && ret == -EDEADLK) { /* Caller needs to exit the ww transaction. */ ret = -ENOSPC; } @@ -993,8 +997,8 @@ __ttm_bo_lru_cursor_iter(struct ttm_bo_lru_cursor *curs, bool first) if (!ttm_lru_walk_trylock(curs, res->bo->base.resv)) { struct dma_resv *resv; - if (!arg->ticket || arg->ctx->no_wait_gpu || - arg->trylock_only) { + if ((!arg->ticket || arg->ctx->no_wait_gpu || + arg->trylock_only) && !arg->ctx->exec) { spin_unlock(lru_lock); continue; } diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h index e1221e3be7bda..0ffa84a5caa65 100644 --- a/include/drm/ttm/ttm_bo.h +++ b/include/drm/ttm/ttm_bo.h @@ -186,6 +186,11 @@ struct ttm_operation_ctx { * @bytes_moved: Statistics on how many bytes have been moved. */ uint64_t bytes_moved; + /* + * @exec: optional drm_exec object to use for locking and contention + * handling + */ + struct drm_exec *exec; }; struct ttm_lru_walk; -- 2.43.0
