This change:
        - Lookups virtgpu_fence given a fence_id
        - Signals all prior fences in a given context
        - Signals current fence

No functional changes yet, since all fences are initialized from
context 0.

Signed-off-by: Gurchetan Singh <gurchetansi...@chromium.org>
---
 drivers/gpu/drm/virtio/virtgpu_fence.c | 27 ++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_fence.c 
b/drivers/gpu/drm/virtio/virtgpu_fence.c
index a63a383347c4..a6c6f498e79e 100644
--- a/drivers/gpu/drm/virtio/virtgpu_fence.c
+++ b/drivers/gpu/drm/virtio/virtgpu_fence.c
@@ -115,17 +115,32 @@ void virtio_gpu_fence_event_process(struct 
virtio_gpu_device *vgdev,
                                    u64 fence_id)
 {
        struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv;
-       struct virtio_gpu_fence *fence, *tmp;
+       struct virtio_gpu_fence *signaled, *curr, *tmp;
        unsigned long irq_flags;
 
        spin_lock_irqsave(&drv->lock, irq_flags);
        atomic64_set(&vgdev->fence_drv.last_fence_id, fence_id);
-       list_for_each_entry_safe(fence, tmp, &drv->fences, node) {
-               if (fence_id < fence->f.seqno)
+       list_for_each_entry_safe(curr, tmp, &drv->fences, node) {
+               if (fence_id != curr->fence_id)
                        continue;
-               dma_fence_signal_locked(&fence->f);
-               list_del(&fence->node);
-               dma_fence_put(&fence->f);
+
+               signaled = curr;
+               list_for_each_entry_safe(curr, tmp, &drv->fences, node) {
+                       if (signaled->f.context != curr->f.context)
+                               continue;
+
+                       if (!dma_fence_is_later(&signaled->f, &curr->f))
+                               continue;
+
+                       dma_fence_signal_locked(&curr->f);
+                       list_del(&curr->node);
+                       dma_fence_put(&curr->f);
+               }
+
+               dma_fence_signal_locked(&signaled->f);
+               list_del(&signaled->node);
+               dma_fence_put(&signaled->f);
+               break;
        }
        spin_unlock_irqrestore(&drv->lock, irq_flags);
 }
-- 
2.25.1.481.gfbce0eb801-goog

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to