Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/virtio: Wait for each dma-fence of in-fence array individually

Use dma-fence-unwrap API for waiting each dma-fence of the in-fence array
individually. Sync file's in-fence array always has a non-matching fence
context ID, which doesn't allow to skip waiting of fences with a matching
context ID in a case of a merged sync file fence.

Suggested-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Tested-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230416115237.798604-3-dmitry.osipenko@collabora.com

+18 -2
+18 -2
drivers/gpu/drm/virtio/virtgpu_submit.c
··· 32 32 void *buf; 33 33 }; 34 34 35 - static int virtio_gpu_dma_fence_wait(struct virtio_gpu_submit *submit, 36 - struct dma_fence *in_fence) 35 + static int virtio_gpu_do_fence_wait(struct virtio_gpu_submit *submit, 36 + struct dma_fence *in_fence) 37 37 { 38 38 u32 context = submit->fence_ctx + submit->ring_idx; 39 39 ··· 41 41 return 0; 42 42 43 43 return dma_fence_wait(in_fence, true); 44 + } 45 + 46 + static int virtio_gpu_dma_fence_wait(struct virtio_gpu_submit *submit, 47 + struct dma_fence *fence) 48 + { 49 + struct dma_fence_unwrap itr; 50 + struct dma_fence *f; 51 + int err; 52 + 53 + dma_fence_unwrap_for_each(f, &itr, fence) { 54 + err = virtio_gpu_do_fence_wait(submit, f); 55 + if (err) 56 + return err; 57 + } 58 + 59 + return 0; 44 60 } 45 61 46 62 static int virtio_gpu_fence_event_create(struct drm_device *dev,