oa_get_render_ctx_id() pins the context before obtaining its hardware ID.
With GuC submission, gen12_get_render_context_id() can fail while
allocating or accessing the scratch buffer used to read that ID. The
error is returned without releasing the context pin.

i915_oa_stream_init() immediately returns this error, and its caller
frees the stream without invoking the stream destroy callback. There is
therefore no later opportunity to release the pin.

Unpin and clear pinned_ctx before returning this error. Also clear the
pointer on the existing context-control-offset error path, so failed
initialization consistently leaves no pinned context in the stream.

Fixes: 682aa4373f15 ("drm/i915/perf: Fix OA filtering logic for GuC mode")
Cc: [email protected]
Assisted-by: DeepSeek-V4.1-Flash and OpenAI Codex
Signed-off-by: Wentao Liang <[email protected]>
---
 drivers/gpu/drm/i915/i915_perf.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 19b82427aa41..73040da7fd16 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1541,6 +1541,7 @@ static int oa_get_render_ctx_id(struct i915_perf_stream 
*stream)
                ret = set_oa_ctx_ctrl_offset(ce);
                if (ret) {
                        intel_context_unpin(ce);
+                       stream->pinned_ctx = NULL;
                        drm_err(&stream->perf->i915->drm,
                                "Enabling perf query failed for %s\n",
                                stream->engine->name);
@@ -1596,6 +1597,12 @@ static int oa_get_render_ctx_id(struct i915_perf_stream 
*stream)
                MISSING_CASE(GRAPHICS_VER(ce->engine->i915));
        }
 
+       if (ret) {
+               intel_context_unpin(ce);
+               stream->pinned_ctx = NULL;
+               return ret;
+       }
+
        ce->tag = stream->specific_ctx_id;
 
        drm_dbg(&stream->perf->i915->drm,
-- 
2.34.1

Reply via email to