diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch new file mode 100644 index 00000000..e4f2ab60 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1523-drm-amdgpu-Ignore-kfd-eviction-fence-in-sync_resv.patch @@ -0,0 +1,132 @@ +From b9c27ae38d45a3c9cbd1b841aa5fcc8b9c34e920 Mon Sep 17 00:00:00 2001 +From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> +Date: Wed, 20 Jul 2016 11:28:54 -0400 +Subject: [PATCH 1523/4131] drm/amdgpu: Ignore kfd eviction fence in sync_resv + +Change-Id: I61fcd385319ea9fa0bf9451124996c65e590184b +Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> + + Conflicts: + drivers/gpu/drm/amd/amdgpu/amdgpu.h +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 26 +++++++++++++++++++----- + 4 files changed, 24 insertions(+), 6 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +index 2db28e5..ed753fc 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +@@ -83,6 +83,7 @@ struct amdgpu_amdkfd_fence { + struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context, + void *mm); + bool amd_kfd_fence_check_mm(struct fence *f, void *mm); ++struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct fence *f); + + /* struct amdkfd_vm - + * For Memory Eviction KGD requires a mechanism to keep track of all KFD BOs +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c +index 7026781..ac167c8 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c +@@ -83,7 +83,7 @@ struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context, + return fence; + } + +-static struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct fence *f) ++struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct fence *f) + { + struct amdgpu_amdkfd_fence *fence; + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +index 322d2529..af8e544 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +@@ -36,6 +36,7 @@ + /* some special values for the owner field */ + #define AMDGPU_FENCE_OWNER_UNDEFINED ((void*)0ul) + #define AMDGPU_FENCE_OWNER_VM ((void*)1ul) ++#define AMDGPU_FENCE_OWNER_KFD ((void *)2ul) + + #define AMDGPU_FENCE_FLAG_64BIT (1 << 0) + #define AMDGPU_FENCE_FLAG_INT (1 << 1) +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +index 8492a26..bc79ef8 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +@@ -31,6 +31,7 @@ + #include <drm/drmP.h> + #include "amdgpu.h" + #include "amdgpu_trace.h" ++#include "amdgpu_amdkfd.h" + + struct amdgpu_sync_entry { + struct hlist_node node; +@@ -84,11 +85,20 @@ static bool amdgpu_sync_same_dev(struct amdgpu_device *adev, + */ + static void *amdgpu_sync_get_owner(struct dma_fence *f) + { +- struct amd_sched_fence *s_fence = to_amd_sched_fence(f); ++ struct amd_sched_fence *s_fence; ++ struct amdgpu_amdkfd_fence *kfd_fence; ++ ++ if (f == NULL) ++ return AMDGPU_FENCE_OWNER_UNDEFINED; + ++ s_fence = to_amd_sched_fence(f); + if (s_fence) + return s_fence->owner; + ++ kfd_fence = to_amdgpu_amdkfd_fence(f); ++ if (kfd_fence) ++ return AMDGPU_FENCE_OWNER_KFD; ++ + return AMDGPU_FENCE_OWNER_UNDEFINED; + } + +@@ -170,7 +180,8 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync, + * @sync: sync object to add fences from reservation object to + * @resv: reservation object with embedded fence + * @shared: true if we should only sync to the exclusive fence +- * Sync to the fence ++ * Sync to the fence except if it is KFD eviction fence and owner is ++ * AMDGPU_FENCE_OWNER_VM. + */ + int amdgpu_sync_resv(struct amdgpu_device *adev, + struct amdgpu_sync *sync, +@@ -186,9 +197,11 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, + if (resv == NULL) + return -EINVAL; + +- /* always sync to the exclusive fence */ + f = reservation_object_get_excl(resv); +- r = amdgpu_sync_fence(adev, sync, f); ++ fence_owner = amdgpu_sync_get_owner(f); ++ if (fence_owner != AMDGPU_FENCE_OWNER_KFD || ++ owner != AMDGPU_FENCE_OWNER_VM) ++ r = amdgpu_sync_fence(adev, sync, f); + + flist = reservation_object_get_list(resv); + if (!flist || r) +@@ -197,12 +210,15 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, + for (i = 0; i < flist->shared_count; ++i) { + f = rcu_dereference_protected(flist->shared[i], + reservation_object_held(resv)); ++ fence_owner = amdgpu_sync_get_owner(f); ++ if (fence_owner == AMDGPU_FENCE_OWNER_KFD && ++ owner == AMDGPU_FENCE_OWNER_VM) ++ continue; + + if (amdgpu_sync_same_dev(adev, f)) { + /* VM updates are only interesting + * for other VM updates and moves. + */ +- fence_owner = amdgpu_sync_get_owner(f); + if ((owner != AMDGPU_FENCE_OWNER_UNDEFINED) && + (fence_owner != AMDGPU_FENCE_OWNER_UNDEFINED) && + ((owner == AMDGPU_FENCE_OWNER_VM) != +-- +2.7.4 + |