On 24/06/2026 12:13, Christian König wrote:
Instead of dma_fence_is_signaled_locked() use
dma_fence_test_signaled_flag().

The extra polling check seems unecessary for those use cases.

Signed-off-by: Christian König <[email protected]>
---
  drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c       | 8 ++++----
  drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c        | 2 +-
  drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 2 +-
  3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index ea69b1bac7c6..1192b9800ff2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -652,7 +652,7 @@ void amdgpu_fence_driver_set_error(struct amdgpu_ring 
*ring, int error)
fence = rcu_dereference_protected(drv->fences[i],
                                                  lockdep_is_held(&drv->lock));
-               if (fence && !dma_fence_is_signaled_locked(fence))
+               if (fence && !dma_fence_test_signaled_flag(fence))
                        dma_fence_set_error(fence, error);
        }
        spin_unlock_irqrestore(&drv->lock, flags);
@@ -677,7 +677,7 @@ void amdgpu_fence_driver_force_completion(struct 
amdgpu_ring *ring,
fence = rcu_dereference_protected(drv->fences[i],
                                                  lockdep_is_held(&drv->lock));
-               if (fence && !dma_fence_is_signaled_locked(fence)) {
+               if (fence && !dma_fence_test_signaled_flag(fence)) {
                        if (fence == timedout_fence)
                                dma_fence_set_error(fence, -ETIME);
                        else
@@ -738,7 +738,7 @@ void amdgpu_ring_set_fence_errors_and_reemit(struct 
amdgpu_ring *ring,
                rcu_read_lock();
                unprocessed = rcu_dereference(*ptr);
- if (unprocessed && !dma_fence_is_signaled_locked(unprocessed)) {
+               if (unprocessed && !dma_fence_test_signaled_flag(unprocessed)) {
                        fence = container_of(unprocessed, struct amdgpu_fence, 
base);
                        is_guilty_fence = fence == guilty_fence;
                        is_guilty_context = fence->context == 
guilty_fence->context;
@@ -802,7 +802,7 @@ void amdgpu_ring_backup_unprocessed_commands(struct 
amdgpu_ring *ring,
                rcu_read_lock();
                unprocessed = rcu_dereference(*ptr);
- if (unprocessed && !dma_fence_is_signaled(unprocessed)) {
+               if (unprocessed && !dma_fence_test_signaled_flag(unprocessed)) {
                        fence = container_of(unprocessed, struct amdgpu_fence, 
base);
amdgpu_ring_backup_unprocessed_command(ring, fence);

No fence->ops->signaled so all good.

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index d6bee5c30073..ae9d6a2eefab 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -460,7 +460,7 @@ bool amdgpu_ring_soft_recovery(struct amdgpu_ring *ring, 
unsigned int vmid,
                return false;
dma_fence_lock_irqsave(fence, flags);
-       if (!dma_fence_is_signaled_locked(fence))
+       if (!dma_fence_test_signaled_flag(fence))
                dma_fence_set_error(fence, -ENODATA);
        dma_fence_unlock_irqrestore(fence, flags);

A bit of an odd function? With this change it becomes:

        dma_fence_lock_irqsave(fence, flags);
        if (!dma_fence_test_signaled_flag(fence))
                dma_fence_set_error(fence, -ENODATA);
        dma_fence_unlock_irqrestore(fence, flags);

        while (!dma_fence_is_signaled(fence) &&
               ktime_to_ns(ktime_sub(deadline, ktime_get())) > 0)
                ring->funcs->soft_recovery(ring, vmid);

        ret = dma_fence_is_signaled(fence);

Does this flow make sense?

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
index a41fb72dba94..2cc6552a6399 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
@@ -426,7 +426,7 @@ amdgpu_userq_fence_driver_set_error(struct 
amdgpu_userq_fence *fence,
f = rcu_dereference_protected(&fence->base,
                                      
lockdep_is_held(&fence_drv->fence_list_lock));
-       if (f && !dma_fence_is_signaled_locked(f))
+       if (f && !dma_fence_test_signaled_flag(f))
                dma_fence_set_error(f, error);
        spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags);
  }

amdgpu_userq_fence_signaled does exists so is there any scope for this to open a false positive window?

Regards,

Tvrtko

Reply via email to