From b9c27ae38d45a3c9cbd1b841aa5fcc8b9c34e920 Mon Sep 17 00:00:00 2001 From: Harish Kasiviswanathan 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 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 #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