diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3726-drm-amdgpu-fix-prime-teardown-order.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3726-drm-amdgpu-fix-prime-teardown-order.patch | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3726-drm-amdgpu-fix-prime-teardown-order.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3726-drm-amdgpu-fix-prime-teardown-order.patch new file mode 100644 index 00000000..bc5df59e --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3726-drm-amdgpu-fix-prime-teardown-order.patch @@ -0,0 +1,101 @@ +From a6ab7d1f283ccbaa9460fcaaf03c4678c2ab7c17 Mon Sep 17 00:00:00 2001 +From: Christian Koenig <christian.koenig@amd.com> +Date: Fri, 9 Mar 2018 14:42:54 +0100 +Subject: [PATCH 3726/4131] drm/amdgpu: fix prime teardown order +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We unmapped imported DMA-bufs when the GEM handle was dropped, not when the +hardware was done with the buffere. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> +CC: stable@vger.kernel.org +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 38 +++++------------------------- + drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 3 +++ + 2 files changed, 9 insertions(+), 32 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +index 05c558d..d5a265e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +@@ -33,21 +33,11 @@ + + void amdgpu_gem_object_free(struct drm_gem_object *gobj) + { +- struct amdgpu_gem_object *aobj; +- +- aobj = container_of((gobj), struct amdgpu_gem_object, base); +- if (aobj->base.import_attach) +- drm_prime_gem_destroy(&aobj->base, aobj->bo->tbo.sg); +- +- ww_mutex_lock(&aobj->bo->tbo.resv->lock, NULL); +- list_del(&aobj->list); +- ww_mutex_unlock(&aobj->bo->tbo.resv->lock); +- +- amdgpu_mn_unregister(aobj->bo); +- amdgpu_bo_unref(&aobj->bo); +- drm_gem_object_release(&aobj->base); +- kfree(aobj); +- ++ struct amdgpu_bo *robj = gem_to_amdgpu_bo(gobj); ++ if (robj) { ++ amdgpu_mn_unregister(robj); ++ amdgpu_bo_unref(&robj); ++ } + } + + int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size, +@@ -104,23 +94,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size, + return r; + } + +- gobj = kzalloc(sizeof(struct amdgpu_gem_object), GFP_KERNEL); +- if (unlikely(!gobj)) { +- amdgpu_bo_unref(&robj); +- return -ENOMEM; +- } +- +- r = drm_gem_object_init(adev->ddev, &gobj->base, amdgpu_bo_size(robj)); +- if (unlikely(r)) { +- kfree(gobj); +- amdgpu_bo_unref(&robj); +- return r; +- } +- +- list_add(&gobj->list, &robj->gem_objects); +- gobj->bo = robj; +- *obj = &gobj->base; +- ++ *obj = &bo->gem_base; + + return 0; + } +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +index 4104eb6..94331fd 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +@@ -54,15 +54,18 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) + { + struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); + struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo); ++ u64 offset; + + if (bo->tbo.mem.mem_type == AMDGPU_PL_DGMA_IMPORT) + kfree(tbo->mem.bus.addr); + if (bo->kfd_bo) + amdgpu_amdkfd_unreserve_system_memory_limit(bo); ++ + amdgpu_bo_kunmap(bo); + + if (bo->gem_base.import_attach) + drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg); ++ drm_gem_object_release(&bo->gem_base); + amdgpu_bo_unref(&bo->parent); + if (!list_empty(&bo->shadow_list)) { + mutex_lock(&adev->shadow_list_lock); +-- +2.7.4 + |