drm/amdgpu: report guilty/innocent context reset status in ctx query

amdgpu_ctx_query() currently reports AMDGPU_CTX_UNKNOWN_RESET whenever
the device reset counter changes, even if the context can be identified
as guilty or unaffected.

Use amdgpu_ctx_guilty() in the ctx query path and return:
- AMDGPU_CTX_GUILTY_RESET for guilty contexts,
- AMDGPU_CTX_INNOCENT_RESET for non-guilty contexts after a reset,
- AMDGPU_CTX_NO_RESET only when no reset occurred and context is not guilty.

This provides accurate per-context reset attribution to userspace instead
of collapsing all reset cases into UNKNOWN.

Signed-off-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index d54cec3e4a53..a88443e0254c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -542,6 +542,8 @@ static int amdgpu_ctx_free(struct amdgpu_fpriv *fpriv, 
uint32_t id)
        return ctx ? 0 : -EINVAL;
 }
 
+static bool amdgpu_ctx_guilty(struct amdgpu_ctx *ctx);
+
 static int amdgpu_ctx_query(struct amdgpu_device *adev,
                            struct amdgpu_fpriv *fpriv, uint32_t id,
                            union drm_amdgpu_ctx_out *out)
@@ -549,6 +551,7 @@ static int amdgpu_ctx_query(struct amdgpu_device *adev,
        struct amdgpu_ctx *ctx;
        struct amdgpu_ctx_mgr *mgr;
        unsigned reset_counter;
+       bool guilty;
 
        if (!fpriv)
                return -EINVAL;
@@ -567,11 +570,13 @@ static int amdgpu_ctx_query(struct amdgpu_device *adev,
 
        /* determine if a GPU reset has occured since the last call */
        reset_counter = atomic_read(&adev->gpu_reset_counter);
-       /* TODO: this should ideally return NO, GUILTY, or INNOCENT. */
-       if (ctx->reset_counter_query == reset_counter)
+       guilty = amdgpu_ctx_guilty(ctx);
+       if (ctx->reset_counter_query == reset_counter && !guilty)
                out->state.reset_status = AMDGPU_CTX_NO_RESET;
+       else if (guilty)
+               out->state.reset_status = AMDGPU_CTX_GUILTY_RESET;
        else
-               out->state.reset_status = AMDGPU_CTX_UNKNOWN_RESET;
+               out->state.reset_status = AMDGPU_CTX_INNOCENT_RESET;
        ctx->reset_counter_query = reset_counter;
 
        mutex_unlock(&mgr->lock);
-- 
2.49.0

Reply via email to