Merge tag 'nfs-for-4.8-2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[deliverable/linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_fence.c
index d1558768cfb73d57e30618b971a5edb5d1f1d54f..0b109aebfec6ddbd003aac9d782d4c9a2aede8df 100644 (file)
@@ -204,16 +204,25 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
        if (seq != ring->fence_drv.sync_seq)
                amdgpu_fence_schedule_fallback(ring);
 
-       while (last_seq != seq) {
+       if (unlikely(seq == last_seq))
+               return;
+
+       last_seq &= drv->num_fences_mask;
+       seq &= drv->num_fences_mask;
+
+       do {
                struct fence *fence, **ptr;
 
-               ptr = &drv->fences[++last_seq & drv->num_fences_mask];
+               ++last_seq;
+               last_seq &= drv->num_fences_mask;
+               ptr = &drv->fences[last_seq];
 
                /* There is always exactly one thread signaling this fence slot */
                fence = rcu_dereference_protected(*ptr, 1);
                RCU_INIT_POINTER(*ptr, NULL);
 
-               BUG_ON(!fence);
+               if (!fence)
+                       continue;
 
                r = fence_signal(fence);
                if (!r)
@@ -222,7 +231,7 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
                        BUG();
 
                fence_put(fence);
-       }
+       } while (last_seq != seq);
 }
 
 /**
This page took 0.032954 seconds and 5 git commands to generate.