create_gang() pins each batch VMA before mapping and submitting it. The
mapping and request allocation error paths drop the object without
unpinning the VMA. Later errors drop the request references but also leave
the pin behind. On success, live_preempt_gang() releases the batch
reference after waiting for each request, again without unpinning it.

Unpin on every error after a successful pin. Keep the batch pinned while
the gang is in use, and unpin it when the caller releases each batch.
This preserves the fixed addresses used by the semaphore chain while
balancing the pin before the final object reference is dropped.

Fixes: 2d19a71ce68f ("drm/i915/selftests: Exercise long preemption chains")
Cc: [email protected]
Assisted-by: DeepSeek-V4.1-Flash and OpenAI Codex
Signed-off-by: Wentao Liang <[email protected]>
---
 drivers/gpu/drm/i915/gt/selftest_execlists.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_execlists.c 
b/drivers/gpu/drm/i915/gt/selftest_execlists.c
index 21e5ed9f72a3..d861e2b27878 100644
--- a/drivers/gpu/drm/i915/gt/selftest_execlists.c
+++ b/drivers/gpu/drm/i915/gt/selftest_execlists.c
@@ -2734,7 +2734,7 @@ static int create_gang(struct intel_engine_cs *engine,
        cs = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
        if (IS_ERR(cs)) {
                err = PTR_ERR(cs);
-               goto err_obj;
+               goto err_unpin;
        }
 
        /* Semaphore target: spin until zero */
@@ -2764,7 +2764,7 @@ static int create_gang(struct intel_engine_cs *engine,
        rq = intel_context_create_request(ce);
        if (IS_ERR(rq)) {
                err = PTR_ERR(rq);
-               goto err_obj;
+               goto err_unpin;
        }
 
        rq->batch = i915_vma_get(vma);
@@ -2789,6 +2789,8 @@ static int create_gang(struct intel_engine_cs *engine,
 err_rq:
        i915_vma_put(rq->batch);
        i915_request_put(rq);
+err_unpin:
+       i915_vma_unpin(vma);
 err_obj:
        i915_gem_object_put(obj);
 err_ce:
@@ -3032,6 +3034,7 @@ static int live_preempt_gang(void *arg)
                                err = -ETIME;
                        }
 
+                       i915_vma_unpin(rq->batch);
                        i915_vma_put(rq->batch);
                        i915_request_put(rq);
                        rq = n;
-- 
2.34.1

Reply via email to