Don't return and sync the user queue eviction fence; otherwise, the eviction fence will be returned as a dependent fence during VM update and refer to the fence result in leakage.
Signed-off-by: Prike Liang <prike.li...@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c | 11 +++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c index d86e611a9ff4..6c9b2b43a929 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c @@ -224,6 +224,17 @@ void amdgpu_eviction_fence_detach(struct amdgpu_eviction_fence_mgr *evf_mgr, dma_fence_put(stub); } +bool amdgpu_eviction_fence_valid(struct dma_fence *f) +{ + + if(!f) + return false; + if (f->ops == &amdgpu_eviction_fence_ops) + return true; + + return false; +} + int amdgpu_eviction_fence_init(struct amdgpu_eviction_fence_mgr *evf_mgr) { /* This needs to be done one time per open */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.h index fcd867b7147d..d4e1975cac71 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.h @@ -42,6 +42,7 @@ struct amdgpu_eviction_fence_mgr { }; /* Eviction fence helper functions */ +bool amdgpu_eviction_fence_valid(struct dma_fence *f); struct amdgpu_eviction_fence * amdgpu_eviction_fence_create(struct amdgpu_eviction_fence_mgr *evf_mgr); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index 5576ed0b508f..d22e6763bfb9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c @@ -185,6 +185,10 @@ static bool amdgpu_sync_test_fence(struct amdgpu_device *adev, { void *fence_owner = amdgpu_sync_get_owner(f); + /* don't sync the kgd userq eviction fence*/ + if(amdgpu_eviction_fence_valid(f)) + return false; + /* Always sync to moves, no matter what */ if (fence_owner == AMDGPU_FENCE_OWNER_UNDEFINED) return true; -- 2.34.1