diff options
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.patch | 132 |
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 + |