Commit 81c6dabc authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/amdgpu: always recreate bo_list

The bo_list handle is allocated by OP_CREATE, so in OP_UPDATE here we just
re-create the bo_list object and replace the handle. This way we don't
need locking to protect the bo_list because it's always re-created when
changed.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarChunming  Zhou <david1.zhou@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4a8c21a1
...@@ -50,7 +50,6 @@ static void amdgpu_bo_list_release_rcu(struct kref *ref) ...@@ -50,7 +50,6 @@ static void amdgpu_bo_list_release_rcu(struct kref *ref)
for (i = 0; i < list->num_entries; ++i) for (i = 0; i < list->num_entries; ++i)
amdgpu_bo_unref(&list->array[i].robj); amdgpu_bo_unref(&list->array[i].robj);
mutex_destroy(&list->lock);
kvfree(list->array); kvfree(list->array);
kfree_rcu(list, rhead); kfree_rcu(list, rhead);
} }
...@@ -70,7 +69,6 @@ int amdgpu_bo_list_create(struct amdgpu_device *adev, ...@@ -70,7 +69,6 @@ int amdgpu_bo_list_create(struct amdgpu_device *adev,
return -ENOMEM; return -ENOMEM;
/* initialize bo list*/ /* initialize bo list*/
mutex_init(&list->lock);
kref_init(&list->refcount); kref_init(&list->refcount);
r = amdgpu_bo_list_set(adev, filp, list, info, num_entries); r = amdgpu_bo_list_set(adev, filp, list, info, num_entries);
if (r) { if (r) {
...@@ -188,7 +186,6 @@ int amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id, ...@@ -188,7 +186,6 @@ int amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id,
if (*result && kref_get_unless_zero(&(*result)->refcount)) { if (*result && kref_get_unless_zero(&(*result)->refcount)) {
rcu_read_unlock(); rcu_read_unlock();
mutex_lock(&(*result)->lock);
return 0; return 0;
} }
...@@ -231,7 +228,6 @@ void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list, ...@@ -231,7 +228,6 @@ void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
void amdgpu_bo_list_put(struct amdgpu_bo_list *list) void amdgpu_bo_list_put(struct amdgpu_bo_list *list)
{ {
mutex_unlock(&list->lock);
kref_put(&list->refcount, amdgpu_bo_list_release_rcu); kref_put(&list->refcount, amdgpu_bo_list_release_rcu);
} }
...@@ -242,7 +238,6 @@ void amdgpu_bo_list_free(struct amdgpu_bo_list *list) ...@@ -242,7 +238,6 @@ void amdgpu_bo_list_free(struct amdgpu_bo_list *list)
for (i = 0; i < list->num_entries; ++i) for (i = 0; i < list->num_entries; ++i)
amdgpu_bo_unref(&list->array[i].robj); amdgpu_bo_unref(&list->array[i].robj);
mutex_destroy(&list->lock);
kvfree(list->array); kvfree(list->array);
kfree(list); kfree(list);
} }
...@@ -297,7 +292,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data, ...@@ -297,7 +292,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
union drm_amdgpu_bo_list *args = data; union drm_amdgpu_bo_list *args = data;
uint32_t handle = args->in.list_handle; uint32_t handle = args->in.list_handle;
struct drm_amdgpu_bo_list_entry *info = NULL; struct drm_amdgpu_bo_list_entry *info = NULL;
struct amdgpu_bo_list *list; struct amdgpu_bo_list *list, *old;
int r; int r;
r = amdgpu_bo_create_list_entry_array(&args->in, &info); r = amdgpu_bo_create_list_entry_array(&args->in, &info);
...@@ -328,16 +323,22 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data, ...@@ -328,16 +323,22 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
break; break;
case AMDGPU_BO_LIST_OP_UPDATE: case AMDGPU_BO_LIST_OP_UPDATE:
r = amdgpu_bo_list_get(fpriv, handle, &list); r = amdgpu_bo_list_create(adev, filp, info, args->in.bo_number,
&list);
if (r) if (r)
goto error_free; goto error_free;
r = amdgpu_bo_list_set(adev, filp, list, info, mutex_lock(&fpriv->bo_list_lock);
args->in.bo_number); old = idr_replace(&fpriv->bo_list_handles, list, handle);
mutex_unlock(&fpriv->bo_list_lock);
if (IS_ERR(old)) {
amdgpu_bo_list_put(list); amdgpu_bo_list_put(list);
if (r) r = PTR_ERR(old);
goto error_free; goto error_free;
}
amdgpu_bo_list_put(old);
break; break;
default: default:
......
...@@ -41,7 +41,6 @@ struct amdgpu_bo_list_entry { ...@@ -41,7 +41,6 @@ struct amdgpu_bo_list_entry {
}; };
struct amdgpu_bo_list { struct amdgpu_bo_list {
struct mutex lock;
struct rcu_head rhead; struct rcu_head rhead;
struct kref refcount; struct kref refcount;
struct amdgpu_bo *gds_obj; struct amdgpu_bo *gds_obj;
......
...@@ -580,9 +580,6 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, ...@@ -580,9 +580,6 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
&p->bo_list); &p->bo_list);
if (r) if (r)
return r; return r;
} else if (p->bo_list) {
mutex_lock(&p->bo_list->lock);
} }
if (p->bo_list) { if (p->bo_list) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment