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