diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0478-drm-amdgpu-improve-sa_bo-fence-by-kernel-fence.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0478-drm-amdgpu-improve-sa_bo-fence-by-kernel-fence.patch | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0478-drm-amdgpu-improve-sa_bo-fence-by-kernel-fence.patch b/common/recipes-kernel/linux/files/0478-drm-amdgpu-improve-sa_bo-fence-by-kernel-fence.patch new file mode 100644 index 00000000..301a7146 --- /dev/null +++ b/common/recipes-kernel/linux/files/0478-drm-amdgpu-improve-sa_bo-fence-by-kernel-fence.patch @@ -0,0 +1,338 @@ +From 4ce9891ee17c6e064cc334e3297f7e992d47f3a6 Mon Sep 17 00:00:00 2001 +From: Chunming Zhou <david1.zhou@amd.com> +Date: Wed, 19 Aug 2015 16:41:19 +0800 +Subject: [PATCH 0478/1050] drm/amdgpu: improve sa_bo->fence by kernel fence + +Signed-off-by: Chunming Zhou <david1.zhou@amd.com> +Reviewed-by: Christian K?nig <christian.koenig@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 8 ++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 22 ++++++------ + drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 4 +-- + drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | 50 ++++++++++++++++++++------- + drivers/gpu/drm/amd/amdgpu/amdgpu_semaphore.c | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- + 8 files changed, 58 insertions(+), 34 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 4addac5..80f2cea 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -441,7 +441,7 @@ int amdgpu_fence_wait_empty(struct amdgpu_ring *ring); + unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring); + + signed long amdgpu_fence_wait_multiple(struct amdgpu_device *adev, +- struct amdgpu_fence **array, ++ struct fence **array, + uint32_t count, + bool wait_all, + bool intr, +@@ -654,7 +654,7 @@ struct amdgpu_sa_bo { + struct amdgpu_sa_manager *manager; + unsigned soffset; + unsigned eoffset; +- struct amdgpu_fence *fence; ++ struct fence *fence; + }; + + /* +@@ -696,7 +696,7 @@ bool amdgpu_semaphore_emit_wait(struct amdgpu_ring *ring, + struct amdgpu_semaphore *semaphore); + void amdgpu_semaphore_free(struct amdgpu_device *adev, + struct amdgpu_semaphore **semaphore, +- struct amdgpu_fence *fence); ++ struct fence *fence); + + /* + * Synchronization +@@ -717,7 +717,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, + int amdgpu_sync_rings(struct amdgpu_sync *sync, + struct amdgpu_ring *ring); + void amdgpu_sync_free(struct amdgpu_device *adev, struct amdgpu_sync *sync, +- struct amdgpu_fence *fence); ++ struct fence *fence); + + /* + * GART structures, functions & helpers +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +index ae014fc..9a87372 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +@@ -836,30 +836,30 @@ static inline bool amdgpu_test_signaled(struct amdgpu_fence *fence) + return test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags); + } + +-static bool amdgpu_test_signaled_any(struct amdgpu_fence **fences, uint32_t count) ++static bool amdgpu_test_signaled_any(struct fence **fences, uint32_t count) + { + int idx; +- struct amdgpu_fence *fence; ++ struct fence *fence; + + for (idx = 0; idx < count; ++idx) { + fence = fences[idx]; + if (fence) { +- if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags)) ++ if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags)) + return true; + } + } + return false; + } + +-static bool amdgpu_test_signaled_all(struct amdgpu_fence **fences, uint32_t count) ++static bool amdgpu_test_signaled_all(struct fence **fences, uint32_t count) + { + int idx; +- struct amdgpu_fence *fence; ++ struct fence *fence; + + for (idx = 0; idx < count; ++idx) { + fence = fences[idx]; + if (fence) { +- if (!test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags)) ++ if (!test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags)) + return false; + } + } +@@ -885,7 +885,7 @@ static signed long amdgpu_fence_default_wait(struct fence *f, bool intr, + struct amdgpu_fence *fence = to_amdgpu_fence(f); + struct amdgpu_device *adev = fence->ring->adev; + +- return amdgpu_fence_wait_multiple(adev, &fence, 1, false, intr, t); ++ return amdgpu_fence_wait_multiple(adev, &f, 1, false, intr, t); + } + + /** +@@ -902,7 +902,7 @@ static signed long amdgpu_fence_default_wait(struct fence *f, bool intr, + * If wait_all is false, it will return when any fence is signaled or timeout. + */ + signed long amdgpu_fence_wait_multiple(struct amdgpu_device *adev, +- struct amdgpu_fence **array, ++ struct fence **array, + uint32_t count, + bool wait_all, + bool intr, +@@ -910,7 +910,7 @@ signed long amdgpu_fence_wait_multiple(struct amdgpu_device *adev, + { + long idx = 0; + struct amdgpu_wait_cb *cb; +- struct amdgpu_fence *fence; ++ struct fence *fence; + + BUG_ON(!array); + +@@ -924,7 +924,7 @@ signed long amdgpu_fence_wait_multiple(struct amdgpu_device *adev, + fence = array[idx]; + if (fence) { + cb[idx].task = current; +- if (fence_add_callback(&fence->base, ++ if (fence_add_callback(fence, + &cb[idx].base, amdgpu_fence_wait_cb)) { + /* The fence is already signaled */ + if (wait_all) +@@ -967,7 +967,7 @@ fence_rm_cb: + for (idx = 0; idx < count; ++idx) { + fence = array[idx]; + if (fence) +- fence_remove_callback(&fence->base, &cb[idx].base); ++ fence_remove_callback(fence, &cb[idx].base); + } + + err_free_cb: +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +index 1c237f5..13c5978 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +@@ -93,8 +93,8 @@ int amdgpu_ib_get(struct amdgpu_ring *ring, struct amdgpu_vm *vm, + */ + void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib) + { +- amdgpu_sync_free(adev, &ib->sync, ib->fence); +- amdgpu_sa_bo_free(adev, &ib->sa_bo, ib->fence); ++ amdgpu_sync_free(adev, &ib->sync, &ib->fence->base); ++ amdgpu_sa_bo_free(adev, &ib->sa_bo, &ib->fence->base); + amdgpu_fence_unref(&ib->fence); + } + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +index 238465a..6ea18dc 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +@@ -193,7 +193,7 @@ int amdgpu_sa_bo_new(struct amdgpu_device *adev, + unsigned size, unsigned align); + void amdgpu_sa_bo_free(struct amdgpu_device *adev, + struct amdgpu_sa_bo **sa_bo, +- struct amdgpu_fence *fence); ++ struct fence *fence); + #if defined(CONFIG_DEBUG_FS) + void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, + struct seq_file *m); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c +index 4597899..b7cbaa9 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c +@@ -139,6 +139,20 @@ int amdgpu_sa_bo_manager_suspend(struct amdgpu_device *adev, + return r; + } + ++static uint32_t amdgpu_sa_get_ring_from_fence(struct fence *f) ++{ ++ struct amdgpu_fence *a_fence; ++ struct amd_sched_fence *s_fence; ++ ++ s_fence = to_amd_sched_fence(f); ++ if (s_fence) ++ return s_fence->entity->scheduler->ring_id; ++ a_fence = to_amdgpu_fence(f); ++ if (a_fence) ++ return a_fence->ring->idx; ++ return 0; ++} ++ + static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo) + { + struct amdgpu_sa_manager *sa_manager = sa_bo->manager; +@@ -147,7 +161,7 @@ static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo) + } + list_del_init(&sa_bo->olist); + list_del_init(&sa_bo->flist); +- amdgpu_fence_unref(&sa_bo->fence); ++ fence_put(sa_bo->fence); + kfree(sa_bo); + } + +@@ -161,7 +175,7 @@ static void amdgpu_sa_bo_try_free(struct amdgpu_sa_manager *sa_manager) + sa_bo = list_entry(sa_manager->hole->next, struct amdgpu_sa_bo, olist); + list_for_each_entry_safe_from(sa_bo, tmp, &sa_manager->olist, olist) { + if (sa_bo->fence == NULL || +- !fence_is_signaled(&sa_bo->fence->base)) { ++ !fence_is_signaled(sa_bo->fence)) { + return; + } + amdgpu_sa_bo_remove_locked(sa_bo); +@@ -246,7 +260,7 @@ static bool amdgpu_sa_event(struct amdgpu_sa_manager *sa_manager, + } + + static bool amdgpu_sa_bo_next_hole(struct amdgpu_sa_manager *sa_manager, +- struct amdgpu_fence **fences, ++ struct fence **fences, + unsigned *tries) + { + struct amdgpu_sa_bo *best_bo = NULL; +@@ -275,7 +289,7 @@ static bool amdgpu_sa_bo_next_hole(struct amdgpu_sa_manager *sa_manager, + sa_bo = list_first_entry(&sa_manager->flist[i], + struct amdgpu_sa_bo, flist); + +- if (!fence_is_signaled(&sa_bo->fence->base)) { ++ if (!fence_is_signaled(sa_bo->fence)) { + fences[i] = sa_bo->fence; + continue; + } +@@ -299,7 +313,8 @@ static bool amdgpu_sa_bo_next_hole(struct amdgpu_sa_manager *sa_manager, + } + + if (best_bo) { +- ++tries[best_bo->fence->ring->idx]; ++ uint32_t idx = amdgpu_sa_get_ring_from_fence(best_bo->fence); ++ ++tries[idx]; + sa_manager->hole = best_bo->olist.prev; + + /* we knew that this one is signaled, +@@ -315,7 +330,7 @@ int amdgpu_sa_bo_new(struct amdgpu_device *adev, + struct amdgpu_sa_bo **sa_bo, + unsigned size, unsigned align) + { +- struct amdgpu_fence *fences[AMDGPU_MAX_RINGS]; ++ struct fence *fences[AMDGPU_MAX_RINGS]; + unsigned tries[AMDGPU_MAX_RINGS]; + int i, r; + signed long t; +@@ -373,7 +388,7 @@ int amdgpu_sa_bo_new(struct amdgpu_device *adev, + } + + void amdgpu_sa_bo_free(struct amdgpu_device *adev, struct amdgpu_sa_bo **sa_bo, +- struct amdgpu_fence *fence) ++ struct fence *fence) + { + struct amdgpu_sa_manager *sa_manager; + +@@ -383,10 +398,11 @@ void amdgpu_sa_bo_free(struct amdgpu_device *adev, struct amdgpu_sa_bo **sa_bo, + + sa_manager = (*sa_bo)->manager; + spin_lock(&sa_manager->wq.lock); +- if (fence && !fence_is_signaled(&fence->base)) { +- (*sa_bo)->fence = amdgpu_fence_ref(fence); +- list_add_tail(&(*sa_bo)->flist, +- &sa_manager->flist[fence->ring->idx]); ++ if (fence && !fence_is_signaled(fence)) { ++ uint32_t idx; ++ (*sa_bo)->fence = fence_get(fence); ++ idx = amdgpu_sa_get_ring_from_fence(fence); ++ list_add_tail(&(*sa_bo)->flist, &sa_manager->flist[idx]); + } else { + amdgpu_sa_bo_remove_locked(*sa_bo); + } +@@ -413,8 +429,16 @@ void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, + seq_printf(m, "[0x%010llx 0x%010llx] size %8lld", + soffset, eoffset, eoffset - soffset); + if (i->fence) { +- seq_printf(m, " protected by 0x%016llx on ring %d", +- i->fence->seq, i->fence->ring->idx); ++ struct amdgpu_fence *a_fence = to_amdgpu_fence(i->fence); ++ struct amd_sched_fence *s_fence = to_amd_sched_fence(i->fence); ++ if (a_fence) ++ seq_printf(m, " protected by 0x%016llx on ring %d", ++ a_fence->seq, a_fence->ring->idx); ++ if (s_fence) ++ seq_printf(m, " protected by 0x%016llx on ring %d", ++ s_fence->v_seq, ++ s_fence->entity->scheduler->ring_id); ++ + } + seq_printf(m, "\n"); + } +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_semaphore.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_semaphore.c +index d6d41a4..ff3ca52 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_semaphore.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_semaphore.c +@@ -87,7 +87,7 @@ bool amdgpu_semaphore_emit_wait(struct amdgpu_ring *ring, + + void amdgpu_semaphore_free(struct amdgpu_device *adev, + struct amdgpu_semaphore **semaphore, +- struct amdgpu_fence *fence) ++ struct fence *fence) + { + if (semaphore == NULL || *semaphore == NULL) { + return; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +index 7cb711f..ee68eeb 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +@@ -234,7 +234,7 @@ int amdgpu_sync_rings(struct amdgpu_sync *sync, + */ + void amdgpu_sync_free(struct amdgpu_device *adev, + struct amdgpu_sync *sync, +- struct amdgpu_fence *fence) ++ struct fence *fence) + { + unsigned i; + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +index dd3415d..d7c02e1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -1042,7 +1042,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, + } + + amdgpu_ring_unlock_commit(ring); +- amdgpu_sync_free(adev, &sync, *fence); ++ amdgpu_sync_free(adev, &sync, &(*fence)->base); + + return 0; + } +-- +1.9.1 + |