From: sashiko-bot@kernel.org
To: "Natalie Vock" <nat@pixelcluster.dev>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v2 07/10] drm/ttm: use ttm_bo_lru_for_each_reserved_guarded in evict_all
Date: Mon, 06 Jul 2026 10:34:37 +0000 [thread overview]
Message-ID: <20260706103438.E40541F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260706-ttm_2_drm_exec-v2-7-4bf6bfc0d320@pixelcluster.dev>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] ttm_resource_manager_evict_all silently skips locked and zero-refcount BOs, failing to completely evict the manager.
- [Medium] cond_resched() is called while the buffer object's dma_resv lock is held.
--
commit ff3394ed91bf06ac0115f1da5665b9edeeb4a66b
Author: Natalie Vock <nat@pixelcluster.dev>
drm/ttm: use ttm_bo_lru_for_each_reserved_guarded in evict_all
Use the for_each loop to evict all BOs of an resource manager as well.
Greately simplifying the handling and finally allows us to remove
ttm_bo_evict_first().
> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c b/drivers/gpu/drm/ttm/ttm_resource.c
> index 154d6739256f8..107b6cfea66b3 100644
> --- a/drivers/gpu/drm/ttm/ttm_resource.c
> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
[ ... ]
> @@ -561,17 +561,24 @@ EXPORT_SYMBOL(ttm_resource_manager_init);
> int ttm_resource_manager_evict_all(struct ttm_device *bdev,
> struct ttm_resource_manager *man)
> {
> - struct ttm_operation_ctx ctx = { };
> + struct ttm_bo_lru_cursor cursor;
> + struct ttm_buffer_object *bo;
> + struct ttm_operation_ctx ctx = {
> + .interruptible = false,
> + .no_wait_gpu = false,
> + };
> + struct ttm_lru_walk_arg arg = {
> + .ctx = &ctx,
> + };
> struct dma_fence *fence;
> int ret, i;
>
> - do {
> - ret = ttm_bo_evict_first(bdev, man, &ctx);
> + ttm_bo_lru_for_each_reserved_guarded(&cursor, man, &arg, bo) {
> + ret = ttm_bo_evict(bo, &ctx);
> + if (ret)
> + return ret;
[Severity: High]
Does this new loop successfully evict all buffers if some are locked by other
threads?
With the previous do/while loop using ttm_bo_evict_first(), it would keep
retrying until the manager was genuinely empty.
Using ttm_bo_lru_for_each_reserved_guarded() with an arg where
arg.ticket = NULL, __ttm_bo_lru_cursor_next() skips locked or zero-refcount BOs:
drivers/gpu/drm/ttm/ttm_bo_util.c:__ttm_bo_lru_cursor_next() {
...
} else if (!arg->ticket || arg->ctx->no_wait_gpu ||
arg->trylock_only) {
spin_unlock(lru_lock);
ttm_bo_put(bo);
spin_lock(lru_lock);
continue;
}
...
}
Because the new loop is a single-pass iteration, will these skipped BOs be left
permanently in the resource manager, potentially causing resource leaks or
kernel crashes (like a WARN_ON for non-empty LRU lists) during driver unload or
device suspend?
> - cond_resched();
> - } while (!ret);
> -
> - if (ret && ret != -ENOENT)
> - return ret;
> + cond_resched();
[Severity: Medium]
Is cond_resched() being called here while holding the buffer object's
dma_resv lock?
The ttm_bo_lru_for_each_reserved_guarded iterator yields each BO with its
dma_resv lock held, and only releases it during the implicit next call at the
end of the loop.
Yielding the CPU while holding this lock might stall other kernel paths waiting
for the lock.
In the previous implementation, the lock was explicitly released inside
ttm_bo_evict_first() before cond_resched() was invoked.
> + }
>
> ret = 0;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260706-ttm_2_drm_exec-v2-0-4bf6bfc0d320@pixelcluster.dev?part=7
next prev parent reply other threads:[~2026-07-06 10:34 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-06 10:07 [PATCH v2 00/10] Use drm_exec to lock TTM buffers, respin Natalie Vock
2026-07-06 10:07 ` [PATCH v2 01/10] drm/exec: Add helper to bypass IGNORE_DUPLICATES flag Natalie Vock
2026-07-06 11:40 ` Christian König
2026-07-06 10:07 ` [PATCH v2 02/10] drm/ttm: replace TTMs refcount with the DRM refcount v4 Natalie Vock
2026-07-06 10:42 ` sashiko-bot
2026-07-06 11:47 ` Christian König
2026-07-06 10:07 ` [PATCH v2 03/10] drm/ttm: remove ttm_lru_walk_ops Natalie Vock
2026-07-06 10:07 ` [PATCH v2 04/10] drm/ttm: grab BO reference before locking it Natalie Vock
2026-07-06 10:07 ` [PATCH v2 05/10] drm/ttm: switch to ttm_bo_lru_for_each_reserved_guarded for swapout Natalie Vock
2026-07-06 10:32 ` sashiko-bot
2026-07-06 10:07 ` [PATCH v2 06/10] drm/ttm: move zombie handling into ttm_bo_evict Natalie Vock
2026-07-06 10:07 ` [PATCH v2 07/10] drm/ttm: use ttm_bo_lru_for_each_reserved_guarded in evict_all Natalie Vock
2026-07-06 10:34 ` sashiko-bot [this message]
2026-07-06 10:07 ` [PATCH v2 08/10] drm/xe: remove workaround for TTM internals Natalie Vock
2026-07-06 10:32 ` sashiko-bot
2026-07-06 10:07 ` [PATCH v2 09/10] drm/ttm: support using drm_exec during eviction v4 Natalie Vock
2026-07-06 10:36 ` sashiko-bot
2026-07-06 10:07 ` [PATCH v2 10/10] drm/amdgpu: use drm_exec during BO validation Natalie Vock
2026-07-06 10:41 ` sashiko-bot
2026-07-06 12:40 ` ✗ LGCI.VerificationFailed: failure for Use drm_exec to lock TTM buffers, respin (rev2) Patchwork
2026-07-06 13:02 ` Patchwork
2026-07-06 14:41 ` ✗ CI.checkpatch: warning for Use drm_exec to lock TTM buffers, respin (rev3) Patchwork
2026-07-06 14:42 ` ✗ CI.KUnit: failure " Patchwork
2026-07-06 23:32 ` ✗ i915.CI.BAT: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260706103438.E40541F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=nat@pixelcluster.dev \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.