aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5029-drm-amdgpu-always-recreate-bo_list.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5029-drm-amdgpu-always-recreate-bo_list.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5029-drm-amdgpu-always-recreate-bo_list.patch132
1 files changed, 132 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5029-drm-amdgpu-always-recreate-bo_list.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5029-drm-amdgpu-always-recreate-bo_list.patch
new file mode 100644
index 00000000..af6e42fb
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5029-drm-amdgpu-always-recreate-bo_list.patch
@@ -0,0 +1,132 @@
+From bfb0b638ae96ec21b96f5552e96cc9d40d5ff417 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Mon, 30 Jul 2018 13:46:04 +0200
+Subject: [PATCH 5029/5725] drm/amdgpu: always recreate bo_list
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+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: Christian König <christian.koenig@amd.com>
+Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 23 ++++++++++++-----------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h | 1 -
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 3 ---
+ 3 files changed, 12 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+index 2247486..f0d85a2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+@@ -50,7 +50,6 @@ static void amdgpu_bo_list_release_rcu(struct kref *ref)
+ for (i = 0; i < list->num_entries; ++i)
+ amdgpu_bo_unref(&list->array[i].robj);
+
+- mutex_destroy(&list->lock);
+ kvfree(list->array);
+ kfree_rcu(list, rhead);
+ }
+@@ -70,7 +69,6 @@ int amdgpu_bo_list_create(struct amdgpu_device *adev,
+ return -ENOMEM;
+
+ /* initialize bo list*/
+- mutex_init(&list->lock);
+ kref_init(&list->refcount);
+ r = amdgpu_bo_list_set(adev, filp, list, info, num_entries);
+ if (r) {
+@@ -188,7 +186,6 @@ int amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id,
+
+ if (*result && kref_get_unless_zero(&(*result)->refcount)) {
+ rcu_read_unlock();
+- mutex_lock(&(*result)->lock);
+ return 0;
+ }
+
+@@ -230,7 +227,6 @@ void amdgpu_bo_list_get_list(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);
+ }
+
+@@ -241,7 +237,6 @@ void amdgpu_bo_list_free(struct amdgpu_bo_list *list)
+ for (i = 0; i < list->num_entries; ++i)
+ amdgpu_bo_unref(&list->array[i].robj);
+
+- mutex_destroy(&list->lock);
+ kvfree(list->array);
+ kfree(list);
+ }
+@@ -296,7 +291,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
+ union drm_amdgpu_bo_list *args = data;
+ uint32_t handle = args->in.list_handle;
+ struct drm_amdgpu_bo_list_entry *info = NULL;
+- struct amdgpu_bo_list *list;
++ struct amdgpu_bo_list *list, *old;
+ int r;
+
+ r = amdgpu_bo_create_list_entry_array(&args->in, &info);
+@@ -327,16 +322,22 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
+ break;
+
+ 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)
+ goto error_free;
+
+- r = amdgpu_bo_list_set(adev, filp, list, info,
+- args->in.bo_number);
+- amdgpu_bo_list_put(list);
+- if (r)
++ mutex_lock(&fpriv->bo_list_lock);
++ old = idr_replace(&fpriv->bo_list_handles, list, handle);
++ mutex_unlock(&fpriv->bo_list_lock);
++
++ if (IS_ERR(old)) {
++ amdgpu_bo_list_put(list);
++ r = PTR_ERR(old);
+ goto error_free;
++ }
+
++ amdgpu_bo_list_put(old);
+ break;
+
+ default:
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
+index 833f846..89195fd 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
+@@ -41,7 +41,6 @@ struct amdgpu_bo_list_entry {
+ };
+
+ struct amdgpu_bo_list {
+- struct mutex lock;
+ struct rcu_head rhead;
+ struct kref refcount;
+ struct amdgpu_bo *gds_obj;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index 08cb8f5..e41ab4f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -580,9 +580,6 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+ &p->bo_list);
+ if (r)
+ return r;
+-
+- } else if (p->bo_list) {
+- mutex_lock(&p->bo_list->lock);
+ }
+
+ if (p->bo_list) {
+--
+2.7.4
+