aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4181-drm-ttm-keep-a-reference-to-transfer-pipelined-BOs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4181-drm-ttm-keep-a-reference-to-transfer-pipelined-BOs.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4181-drm-ttm-keep-a-reference-to-transfer-pipelined-BOs.patch115
1 files changed, 115 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4181-drm-ttm-keep-a-reference-to-transfer-pipelined-BOs.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4181-drm-ttm-keep-a-reference-to-transfer-pipelined-BOs.patch
new file mode 100644
index 00000000..ebb62acd
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4181-drm-ttm-keep-a-reference-to-transfer-pipelined-BOs.patch
@@ -0,0 +1,115 @@
+From 1d6bd2922f4861f64799c61410028e3c86565194 Mon Sep 17 00:00:00 2001
+From: christian koenig <christian.koenig@amd.com>
+Date: Fri, 9 Mar 2018 13:39:47 +0100
+Subject: [PATCH 4181/5725] drm/ttm: keep a reference to transfer pipelined BOs
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Make sure the transfered BO is never destroy before the transfer BO.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Roger He <Hongbo.He@amd.com>
+
+Conflicts:
+ drivers/gpu/drm/ttm/ttm_bo_util.c
+
+Change-Id: I967267305604a98371dd395428ac6729412db03a
+---
+ drivers/gpu/drm/ttm/ttm_bo_util.c | 51 ++++++++++++++++++++++++---------------
+ 1 file changed, 31 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
+index de9161f..0b0a72e 100644
+--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
++++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
+@@ -39,6 +39,11 @@
+ #include <linux/module.h>
+ #include <linux/reservation.h>
+
++struct ttm_transfer_obj {
++ struct ttm_buffer_object base;
++ struct ttm_buffer_object *bo;
++};
++
+ void ttm_bo_free_old_node(struct ttm_buffer_object *bo)
+ {
+ ttm_bo_mem_put(bo, &bo->mem);
+@@ -435,7 +440,11 @@ EXPORT_SYMBOL(ttm_bo_move_memcpy);
+
+ static void ttm_transfered_destroy(struct ttm_buffer_object *bo)
+ {
+- kfree(bo);
++ struct ttm_transfer_obj *fbo;
++
++ fbo = container_of(bo, struct ttm_transfer_obj, base);
++ ttm_bo_unref(&fbo->bo);
++ kfree(fbo);
+ }
+
+ /**
+@@ -456,14 +465,15 @@ static void ttm_transfered_destroy(struct ttm_buffer_object *bo)
+ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
+ struct ttm_buffer_object **new_obj)
+ {
+- struct ttm_buffer_object *fbo;
++ struct ttm_transfer_obj *fbo;
+ int ret;
+
+ fbo = kmalloc(sizeof(*fbo), GFP_KERNEL);
+ if (!fbo)
+ return -ENOMEM;
+
+- *fbo = *bo;
++ fbo->base = *bo;
++ fbo->bo = ttm_bo_reference(bo);
+
+ /**
+ * Fix up members that we shouldn't copy directly:
+@@ -471,25 +481,26 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
+ */
+
+ atomic_inc(&bo->bdev->glob->bo_count);
+- INIT_LIST_HEAD(&fbo->ddestroy);
+- INIT_LIST_HEAD(&fbo->lru);
+- INIT_LIST_HEAD(&fbo->swap);
+- INIT_LIST_HEAD(&fbo->io_reserve_lru);
+- mutex_init(&fbo->wu_mutex);
+- fbo->moving = NULL;
+- drm_vma_node_reset(&fbo->vma_node);
+- atomic_set(&fbo->cpu_writers, 0);
+-
+- kref_init(&fbo->list_kref);
+- kref_init(&fbo->kref);
+- fbo->destroy = &ttm_transfered_destroy;
+- fbo->acc_size = 0;
+- fbo->resv = &fbo->ttm_resv;
+- reservation_object_init(fbo->resv);
+- ret = reservation_object_trylock(fbo->resv);
++ INIT_LIST_HEAD(&fbo->base.ddestroy);
++ INIT_LIST_HEAD(&fbo->base.lru);
++ INIT_LIST_HEAD(&fbo->base.swap);
++ INIT_LIST_HEAD(&fbo->base.io_reserve_lru);
++ mutex_init(&fbo->base.wu_mutex);
++ fbo->base.moving = NULL;
++ drm_vma_node_reset(&fbo->base.vma_node);
++ atomic_set(&fbo->base.cpu_writers, 0);
++
++ kref_init(&fbo->base.list_kref);
++ kref_init(&fbo->base.kref);
++ fbo->base.destroy = &ttm_transfered_destroy;
++ fbo->base.acc_size = 0;
++ fbo->base.resv = &fbo->base.ttm_resv;
++ reservation_object_init(fbo->base.resv);
++ ret = reservation_object_trylock(fbo->base.resv);
++
+ WARN_ON(!ret);
+
+- *new_obj = fbo;
++ *new_obj = &fbo->base;
+ return 0;
+ }
+
+--
+2.7.4
+