NAK, we have tried this before.

This way we can accidentally try to signal a fence twice when the fence value is somehow corrupted.

Christian.

Am 25.10.2017 um 11:22 schrieb Monk Liu:
In amdgpu_fence_process it shouldn't put the signaled hw fence and set
RCU pointer to NULL, instead the more reasonable sequence is just leave
the RCU be there untouched, and:
1) Either driver_fini() should put this RCU fence or
2) New hw fence emitting should take the RCU slot and put the old hw fence.

mapping between get & put on hw fence is:

Get                                             Put
fence_emit:fence_init   ---> free_job:put job->fence
                        ---> run_job:put job->fence //GPU RESET case

fence_emit:rcu_assign_pointer   ---> fence_driver_fini:put 
ring->fence_drv.fences[j]
                                ---> fence_emit:put(old) //after fence_wait(old)

run_job:job->fence=fence_get()       --> sched_main:put(fence)
                                --> job_recovery:put(fence) //for GPU RESET case

sched_main:parent=fence_get()   --> sched_fence_free:put(fence->parent)
sched_job_recovery:parent=fence_get() --> 
sched_hw_job_reset:put(s_job->s_fence->parent) // for GPU RESET case

Change-Id: I623167c1e3143233f4e1be7a400a9b698b4a1355
Signed-off-by: Monk Liu <[email protected]>
---
  drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index f43319c..d7374cf 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -161,6 +161,8 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct 
dma_fence **f)
                dma_fence_wait(old, false);
        }
+ dma_fence_put(old);
+
        rcu_assign_pointer(*ptr, dma_fence_get(&fence->base));
*f = &fence->base;
@@ -246,7 +248,6 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
/* There is always exactly one thread signaling this fence slot */
                fence = rcu_dereference_protected(*ptr, 1);
-               RCU_INIT_POINTER(*ptr, NULL);
if (!fence)
                        continue;
@@ -257,7 +258,6 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
                else
                        BUG();
- dma_fence_put(fence);
        } while (last_seq != seq);
  }


_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to