diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/0804-drm-amdgpu-hybrid-add-dependency-to-sync-fence-for-s.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/0804-drm-amdgpu-hybrid-add-dependency-to-sync-fence-for-s.patch | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/0804-drm-amdgpu-hybrid-add-dependency-to-sync-fence-for-s.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/0804-drm-amdgpu-hybrid-add-dependency-to-sync-fence-for-s.patch new file mode 100644 index 00000000..377dcd1d --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/0804-drm-amdgpu-hybrid-add-dependency-to-sync-fence-for-s.patch @@ -0,0 +1,158 @@ +From 8d4e0616077e5441940a3230744eb2b45d93e139 Mon Sep 17 00:00:00 2001 +From: Junwei Zhang <Jerry.Zhang@amd.com> +Date: Mon, 15 May 2017 10:32:42 +0800 +Subject: [PATCH 0804/4131] drm/amdgpu: [hybrid] add dependency to sync fence + for semaphore + +It also fixed sem list soft lockup issue + +[ 264.133878] NMI watchdog: BUG: soft lockup - CPU#5 stuck for 22s! +... +[ 264.133928] task: ffffa216ffbfbd00 task.stack: ffffa216f4220000 +[ 264.133929] RIP: 0010:[<ffffffffc0584523>] [<ffffffffc0584523>] +amdgpu_sem_put+0x13/0x30 [amdgpu] +[ 264.133983] RSP: 0018:ffffa216f4223cb0 EFLAGS: 00200286 + +Change-Id: I8e99ba32319deffca472c2d943beaa750e4297c1 +Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com> +Reviewed-by: David Zhou <david1.zhou@amd.com> +Reviewed-by: Monk Liu <monk.liu@amd.com> + + Conflicts: + drivers/gpu/drm/amd/amdgpu/amdgpu_sem.c +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 12 ++++++++---- + drivers/gpu/drm/amd/amdgpu/amdgpu_sem.c | 29 +++++++++++++++++------------ + drivers/gpu/drm/amd/amdgpu/amdgpu_sem.h | 5 +++++ + 4 files changed, 31 insertions(+), 17 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 5d9fcc2..729f7da 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -712,7 +712,7 @@ struct amdgpu_ctx_ring { + uint64_t sequence; + struct dma_fence **fences; + struct amd_sched_entity entity; +- struct list_head sem_list; ++ struct list_head sem_dep_list; + struct mutex sem_lock; + }; + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +index 0f84e4d..49c00fb 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +@@ -42,7 +42,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev, struct amdgpu_ctx *ctx) + for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { + ctx->rings[i].sequence = 1; + ctx->rings[i].fences = &ctx->fences[amdgpu_sched_jobs * i]; +- INIT_LIST_HEAD(&ctx->rings[i].sem_list); ++ INIT_LIST_HEAD(&ctx->rings[i].sem_dep_list); + mutex_init(&ctx->rings[i].sem_lock); + } + +@@ -88,12 +88,16 @@ static void amdgpu_ctx_fini(struct amdgpu_ctx *ctx) + return; + + for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { +- struct amdgpu_sem *sem, *tmp; ++ struct amdgpu_sem_dep *dep, *tmp; + + mutex_lock(&ctx->rings[i].sem_lock); + /* release all the reset inserted SEM here */ +- list_for_each_entry_safe(sem, tmp, &ctx->rings[i].sem_list, list) +- amdgpu_sem_put(sem); ++ list_for_each_entry_safe(dep, tmp, &ctx->rings[i].sem_dep_list, ++ list) { ++ dma_fence_put(dep->fence); ++ list_del_init(&dep->list); ++ kfree(dep); ++ } + + mutex_unlock(&ctx->rings[i].sem_lock); + mutex_destroy(&ctx->rings[i].sem_lock); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sem.c +index fab6164..5dc76f1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sem.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sem.c +@@ -357,6 +357,7 @@ static int amdgpu_sem_cring_add(struct amdgpu_fpriv *fpriv, + { + struct amdgpu_ring *out_ring; + struct amdgpu_ctx *ctx; ++ struct amdgpu_sem_dep *dep; + uint32_t ctx_id, ip_type, ip_instance, ring; + int r; + +@@ -371,10 +372,17 @@ static int amdgpu_sem_cring_add(struct amdgpu_fpriv *fpriv, + &out_ring); + if (r) + goto err; ++ ++ dep = kzalloc(sizeof(*dep), GFP_KERNEL); ++ if (!dep) ++ goto err; ++ ++ INIT_LIST_HEAD(&dep->list); ++ dep->fence = dma_fence_get(sem->base->fence); ++ + mutex_lock(&ctx->rings[out_ring->idx].sem_lock); +- list_add(&sem->list, &ctx->rings[out_ring->idx].sem_list); ++ list_add(&dep->list, &ctx->rings[out_ring->idx].sem_dep_list); + mutex_unlock(&ctx->rings[out_ring->idx].sem_lock); +- amdgpu_sem_get(sem); + + err: + amdgpu_ctx_put(ctx); +@@ -384,24 +392,21 @@ static int amdgpu_sem_cring_add(struct amdgpu_fpriv *fpriv, + int amdgpu_sem_add_cs(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring, + struct amdgpu_sync *sync) + { +- struct amdgpu_sem *sem, *tmp; ++ struct amdgpu_sem_dep *dep, *tmp; + int r = 0; + +- if (list_empty(&ctx->rings[ring->idx].sem_list)) ++ if (list_empty(&ctx->rings[ring->idx].sem_dep_list)) + return 0; + + mutex_lock(&ctx->rings[ring->idx].sem_lock); +- list_for_each_entry_safe(sem, tmp, &ctx->rings[ring->idx].sem_list, ++ list_for_each_entry_safe(dep, tmp, &ctx->rings[ring->idx].sem_dep_list, + list) { +- r = amdgpu_sync_fence(ctx->adev, sync, sem->base->fence); ++ r = amdgpu_sync_fence(ctx->adev, sync, dep->fence); + if (r) + goto err; +- mutex_lock(&sem->base->lock); +- dma_fence_put(sem->base->fence); +- sem->base->fence = NULL; +- mutex_unlock(&sem->base->lock); +- list_del_init(&sem->list); +- amdgpu_sem_put(sem); ++ dma_fence_put(dep->fence); ++ list_del_init(&dep->list); ++ kfree(dep); + } + err: + mutex_unlock(&ctx->rings[ring->idx].sem_lock); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sem.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sem.h +index 1b8006f..08cda20 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sem.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sem.h +@@ -40,6 +40,11 @@ struct amdgpu_sem_core { + struct mutex lock; + }; + ++struct amdgpu_sem_dep { ++ struct dma_fence *fence; ++ struct list_head list; ++}; ++ + struct amdgpu_sem { + struct amdgpu_sem_core *base; + struct kref kref; +-- +2.7.4 + |