瀏覽代碼

drm/amdgpu: remove unsafe context releasing

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>
Marek Olšák 10 年之前
父節點
當前提交
f11358daa9
共有 1 個文件被更改,包括 2 次插入10 次删除
  1. 2 10
      drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c

+ 2 - 10
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c

@@ -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 amdgpu_ctx_free(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, uint32_t id)
 {
 {
-	int r;
 	struct amdgpu_ctx *ctx;
 	struct amdgpu_ctx *ctx;
 	struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr;
 	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);
 	ctx = idr_find(&mgr->ctx_handles, id);
 	rcu_read_unlock();
 	rcu_read_unlock();
 	if (ctx) {
 	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;
 	return -EINVAL;
 }
 }