drm/amdgpu: remove unsafe context releasing
authorMarek Olšák <marek.olsak@amd.com>
Mon, 4 May 2015 22:56:45 +0000 (00:56 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 4 Jun 2015 01:03:27 +0000 (21:03 -0400)
If ctx was released between put and get, then "get" would crash.

Signed-off-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c

index 235010a83f8f550beaf74c239f6f251988866f83..ffb13a66e288745b7e9bb73b2986b3e00c09a79e 100644 (file)
@@ -69,7 +69,6 @@ int amdgpu_ctx_alloc(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, uin
 
 int amdgpu_ctx_free(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, uint32_t id)
 {
-       int r;
        struct amdgpu_ctx *ctx;
        struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr;
 
@@ -77,15 +76,8 @@ int amdgpu_ctx_free(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, uint
        ctx = idr_find(&mgr->ctx_handles, id);
        rcu_read_unlock();
        if (ctx) {
-               /* if no task is pending on this context, free it */
-               r = kref_put(&ctx->refcount, amdgpu_ctx_do_release);
-               if (r == 1)
-                       return 0;//context is removed successfully
-               else {
-                       /* context is still in using */
-                       kref_get(&ctx->refcount);
-                       return -ERESTARTSYS;
-               }
+               kref_put(&ctx->refcount, amdgpu_ctx_do_release);
+               return 0;
        }
        return -EINVAL;
 }