[RFC PATCH 12/18] drm/ttm: Do not evict BOs with higher priority
Christian König
christian.koenig at amd.com
Thu Apr 25 06:26:21 UTC 2024
Am 24.04.24 um 18:57 schrieb Friedrich Vock:
> This makes buffer eviction significantly more stable by avoiding
> ping-ponging caused by low-priority buffers evicting high-priority
> buffers and vice versa.
And creates a deny of service for the whole system by fork() bombing.
This is another very big NAK.
Regards,
Christian.
>
> Signed-off-by: Friedrich Vock <friedrich.vock at gmx.de>
> ---
> drivers/gpu/drm/ttm/ttm_bo.c | 9 +++++++--
> drivers/gpu/drm/ttm/ttm_resource.c | 5 +++--
> include/drm/ttm/ttm_bo.h | 1 +
> 3 files changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 3047c763eb4eb..eae54cd4a7ce9 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -776,6 +776,7 @@ static int ttm_mem_evict_wait_busy(struct ttm_buffer_object *busy_bo,
> int ttm_mem_evict_first(struct ttm_device *bdev,
> struct ttm_resource_manager *man,
> const struct ttm_place *place,
> + unsigned int max_priority,
> struct ttm_operation_ctx *ctx,
> struct ww_acquire_ctx *ticket)
> {
> @@ -788,6 +789,8 @@ int ttm_mem_evict_first(struct ttm_device *bdev,
> spin_lock(&bdev->lru_lock);
> ttm_resource_manager_for_each_res(man, &cursor, res) {
> bool busy;
> + if (res->bo->priority > max_priority)
> + break;
>
> if (!ttm_bo_evict_swapout_allowable(res->bo, ctx, place,
> &locked, &busy)) {
> @@ -930,8 +933,10 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
> return ret;
> if (ctx->no_evict)
> return -ENOSPC;
> - ret = ttm_mem_evict_first(bdev, man, place, ctx,
> - ticket);
> + if (!bo->priority)
> + return -ENOSPC;
> + ret = ttm_mem_evict_first(bdev, man, place, bo->priority - 1,
> + ctx, ticket);
> if (unlikely(ret != 0))
> return ret;
> } while (1);
> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c b/drivers/gpu/drm/ttm/ttm_resource.c
> index 1d6755a1153b1..63d4371adb519 100644
> --- a/drivers/gpu/drm/ttm/ttm_resource.c
> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
> @@ -431,8 +431,9 @@ int ttm_resource_manager_evict_all(struct ttm_device *bdev,
> for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) {
> while (!list_empty(&man->lru[i])) {
> spin_unlock(&bdev->lru_lock);
> - ret = ttm_mem_evict_first(bdev, man, NULL, &ctx,
> - NULL);
> + ret = ttm_mem_evict_first(bdev, man, NULL,
> + TTM_MAX_BO_PRIORITY,
> + &ctx, NULL);
> if (ret)
> return ret;
> spin_lock(&bdev->lru_lock);
> diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
> index 8f4e6366c0417..91299a3b6fcfa 100644
> --- a/include/drm/ttm/ttm_bo.h
> +++ b/include/drm/ttm/ttm_bo.h
> @@ -396,6 +396,7 @@ void ttm_bo_unpin(struct ttm_buffer_object *bo);
> int ttm_mem_evict_first(struct ttm_device *bdev,
> struct ttm_resource_manager *man,
> const struct ttm_place *place,
> + unsigned int max_priority,
> struct ttm_operation_ctx *ctx,
> struct ww_acquire_ctx *ticket);
> void ttm_mem_unevict_evicted(struct ttm_device *bdev,
> --
> 2.44.0
>
More information about the amd-gfx
mailing list