diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0481-drm-amdgpu-fix-fence-wait-in-sync_fence-instead-shou.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0481-drm-amdgpu-fix-fence-wait-in-sync_fence-instead-shou.patch | 162 |
1 files changed, 0 insertions, 162 deletions
diff --git a/common/recipes-kernel/linux/files/0481-drm-amdgpu-fix-fence-wait-in-sync_fence-instead-shou.patch b/common/recipes-kernel/linux/files/0481-drm-amdgpu-fix-fence-wait-in-sync_fence-instead-shou.patch deleted file mode 100644 index a38c73a6..00000000 --- a/common/recipes-kernel/linux/files/0481-drm-amdgpu-fix-fence-wait-in-sync_fence-instead-shou.patch +++ /dev/null @@ -1,162 +0,0 @@ -From f91b3a69418120974c9a416939b903ec86607c52 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> -Date: Thu, 20 Aug 2015 14:47:40 +0800 -Subject: [PATCH 0481/1050] drm/amdgpu: fix fence wait in sync_fence, instead - should be in sync_rings -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Christian König <christian.koenig@amd.com> -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 | 2 ++ - drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 6 +++- - drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 56 ++++++++++++++++++++++++++++++-- - 3 files changed, 61 insertions(+), 3 deletions(-) - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -index 65e0e94..3c54872 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -@@ -704,6 +704,7 @@ void amdgpu_semaphore_free(struct amdgpu_device *adev, - struct amdgpu_sync { - struct amdgpu_semaphore *semaphores[AMDGPU_NUM_SYNCS]; - struct amdgpu_fence *sync_to[AMDGPU_MAX_RINGS]; -+ DECLARE_HASHTABLE(fences, 4); - struct amdgpu_fence *last_vm_update; - }; - -@@ -716,6 +717,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, - void *owner); - int amdgpu_sync_rings(struct amdgpu_sync *sync, - struct amdgpu_ring *ring); -+int amdgpu_sync_wait(struct amdgpu_sync *sync); - void amdgpu_sync_free(struct amdgpu_device *adev, struct amdgpu_sync *sync, - struct fence *fence); - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c -index 737c8e3..c439735 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c -@@ -140,7 +140,11 @@ int amdgpu_ib_schedule(struct amdgpu_device *adev, unsigned num_ibs, - dev_err(adev->dev, "couldn't schedule ib\n"); - return -EINVAL; - } -- -+ r = amdgpu_sync_wait(&ibs->sync); -+ if (r) { -+ dev_err(adev->dev, "IB sync failed (%d).\n", r); -+ return r; -+ } - r = amdgpu_ring_lock(ring, (256 + AMDGPU_NUM_SYNCS * 8) * num_ibs); - if (r) { - dev_err(adev->dev, "scheduling IB failed (%d).\n", r); -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c -index ee68eeb..febbf37 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c -@@ -32,6 +32,11 @@ - #include "amdgpu.h" - #include "amdgpu_trace.h" - -+struct amdgpu_sync_entry { -+ struct hlist_node node; -+ struct fence *fence; -+}; -+ - /** - * amdgpu_sync_create - zero init sync object - * -@@ -49,6 +54,7 @@ void amdgpu_sync_create(struct amdgpu_sync *sync) - for (i = 0; i < AMDGPU_MAX_RINGS; ++i) - sync->sync_to[i] = NULL; - -+ hash_init(sync->fences); - sync->last_vm_update = NULL; - } - -@@ -62,6 +68,7 @@ void amdgpu_sync_create(struct amdgpu_sync *sync) - int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync, - struct fence *f) - { -+ struct amdgpu_sync_entry *e; - struct amdgpu_fence *fence; - struct amdgpu_fence *other; - -@@ -69,8 +76,27 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync, - return 0; - - fence = to_amdgpu_fence(f); -- if (!fence || fence->ring->adev != adev) -- return fence_wait(f, true); -+ if (!fence || fence->ring->adev != adev) { -+ hash_for_each_possible(sync->fences, e, node, f->context) { -+ struct fence *new; -+ if (unlikely(e->fence->context != f->context)) -+ continue; -+ new = fence_get(fence_later(e->fence, f)); -+ if (new) { -+ fence_put(e->fence); -+ e->fence = new; -+ } -+ return 0; -+ } -+ -+ e = kmalloc(sizeof(struct amdgpu_sync_entry), GFP_KERNEL); -+ if (!e) -+ return -ENOMEM; -+ -+ hash_add(sync->fences, &e->node, f->context); -+ e->fence = fence_get(f); -+ return 0; -+ } - - other = sync->sync_to[fence->ring->idx]; - sync->sync_to[fence->ring->idx] = amdgpu_fence_ref( -@@ -147,6 +173,24 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, - return r; - } - -+int amdgpu_sync_wait(struct amdgpu_sync *sync) -+{ -+ struct amdgpu_sync_entry *e; -+ struct hlist_node *tmp; -+ int i, r; -+ -+ hash_for_each_safe(sync->fences, i, tmp, e, node) { -+ r = fence_wait(e->fence, false); -+ if (r) -+ return r; -+ -+ hash_del(&e->node); -+ fence_put(e->fence); -+ kfree(e); -+ } -+ return 0; -+} -+ - /** - * amdgpu_sync_rings - sync ring to all registered fences - * -@@ -236,8 +280,16 @@ void amdgpu_sync_free(struct amdgpu_device *adev, - struct amdgpu_sync *sync, - struct fence *fence) - { -+ struct amdgpu_sync_entry *e; -+ struct hlist_node *tmp; - unsigned i; - -+ hash_for_each_safe(sync->fences, i, tmp, e, node) { -+ hash_del(&e->node); -+ fence_put(e->fence); -+ kfree(e); -+ } -+ - for (i = 0; i < AMDGPU_NUM_SYNCS; ++i) - amdgpu_semaphore_free(adev, &sync->semaphores[i], fence); - --- -1.9.1 - |