Hi all, this is a respin of Christian's patchset to make TTM use drm_exec for evicting buffers.
I've been investigating VRAM management for amdgpu quite a bit in recent times, and under really strong VRAM contention I observed frequent instabilities/random crashes that I traced back to TTM being unable to evict buffers properly. The typical failure case was one game squatting more or less all of VRAM while also being rather spammy with submits. In that case, trylocking fails because concurrent submits from the game already hold buffer locks, and since there isn't much else to evict, allocation just fails. The original patchset ended up fizzling out in previous attempts to upstream it, but I think it's worth retrying to upstream this, so I took over and rebased it on top of current drm-misc-next. Aside from that, while testing the patchset I found two bugs causing rather random issues ranging from kernel crashes to random GPU hangs in it, which I fixed for this respin. The two bugs were: 1. The ttm_buffer_object duplication in ttm_buffer_object_transfer did not alter the GEM object's driver function pointers, so the transferred object erroneously inherited the free() function of the source buffer. When the transferred object was freed, the driver's free function was invoked and treated the transferred TTM bo as if it was a driver BO. Hilarity ensued. 2. drm_exec LRU walks were missing handling for already-locked objects. If the incoming exec object was created without DRM_EXEC_IGNORE_DUPLICATES, drm_exec_lock_obj would return -EALREADY and the buffer would be skipped even if ctx->allow_res_evict was set (funkiness level: moderate). If the exec did have DRM_EXEC_IGNORE_DUPLICATES set, the buffer would be processed, and then unlocked, silently dropping the lock of some random object that the caller expected to stay locked (funkiness level: off the charts). With those two bugs fixed, VRAM overcommit works considerably more stable - there are no random eviction failures and related fallouts at all anymore. Signed-off-by: Natalie Vock <[email protected]> --- Changes in v2: - Switched to my new email - Reworked drm_exec patch for always reporting duplicates (Christian) - Removed spurious continue; rebase artifact in swapout - Removed incorrect trylock_only for evict_all - Link to v1: https://patch.msgid.link/[email protected] --- Natalie Vock (10): drm/exec: Add helper to bypass IGNORE_DUPLICATES flag drm/ttm: replace TTMs refcount with the DRM refcount v4 drm/ttm: remove ttm_lru_walk_ops drm/ttm: grab BO reference before locking it drm/ttm: switch to ttm_bo_lru_for_each_reserved_guarded for swapout drm/ttm: move zombie handling into ttm_bo_evict drm/ttm: use ttm_bo_lru_for_each_reserved_guarded in evict_all drm/xe: remove workaround for TTM internals drm/ttm: support using drm_exec during eviction v4 drm/amdgpu: use drm_exec during BO validation drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 80 +++---- drivers/gpu/drm/drm_exec.c | 54 +++-- drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 35 ++- drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c | 8 +- drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c | 2 - drivers/gpu/drm/ttm/ttm_bo.c | 272 +++++++---------------- drivers/gpu/drm/ttm/ttm_bo_internal.h | 17 +- drivers/gpu/drm/ttm/ttm_bo_util.c | 58 +++-- drivers/gpu/drm/ttm/ttm_device.c | 18 +- drivers/gpu/drm/ttm/ttm_resource.c | 21 +- drivers/gpu/drm/xe/xe_bo.c | 32 +-- include/drm/drm_exec.h | 2 + include/drm/ttm/ttm_bo.h | 50 ++--- 13 files changed, 295 insertions(+), 354 deletions(-) --- base-commit: 44d19b8a7548aa25cbc6ebd5f27e958f7142c36b change-id: 20260703-ttm_2_drm_exec-2dbdb1fb9d43 Best regards, -- Natalie Vock <[email protected]>
