[PATCH RFC POC 29/50] drm/virtio: install the out-fence descriptor when the ioctl returns
From: Christian Brauner
Date: Tue Sep 15 2026 - 07:56:55 EST
Rely on the fd exit path machinery.
Signed-off-by: Christian Brauner (Amutable) <brauner@xxxxxxxxxx>
---
drivers/gpu/drm/virtio/virtgpu_submit.c | 32 ++++++++++++--------------------
1 file changed, 12 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/virtio/virtgpu_submit.c b/drivers/gpu/drm/virtio/virtgpu_submit.c
index 32cb1e4aa425..51b224acb72b 100644
--- a/drivers/gpu/drm/virtio/virtgpu_submit.c
+++ b/drivers/gpu/drm/virtio/virtgpu_submit.c
@@ -39,7 +39,7 @@ struct virtio_gpu_submit {
struct virtio_gpu_device *vgdev;
struct sync_file *sync_file;
struct drm_file *file;
- int out_fence_fd;
+ const struct fd_slot *out_fence_fd;
u64 fence_ctx;
u32 ring_idx;
void *buf;
@@ -340,14 +340,8 @@ static void virtio_gpu_cleanup_submit(struct virtio_gpu_submit *submit)
if (submit->buflist)
virtio_gpu_array_put_free(submit->buflist);
- if (submit->out_fence_fd >= 0)
- put_unused_fd(submit->out_fence_fd);
-
if (submit->out_fence)
dma_fence_put(&submit->out_fence->f);
-
- if (submit->sync_file)
- fput(submit->sync_file->file);
}
static void virtio_gpu_submit(struct virtio_gpu_submit *submit)
@@ -363,7 +357,7 @@ static void virtio_gpu_complete_submit(struct virtio_gpu_submit *submit)
submit->buf = NULL;
submit->buflist = NULL;
submit->sync_file = NULL;
- submit->out_fence_fd = -1;
+ submit->out_fence_fd = NULL;
}
static int virtio_gpu_init_submit(struct virtio_gpu_submit *submit,
@@ -405,7 +399,7 @@ static int virtio_gpu_init_submit(struct virtio_gpu_submit *submit,
submit->out_fence = out_fence;
submit->fence_ctx = fence_ctx;
submit->ring_idx = ring_idx;
- submit->out_fence_fd = -1;
+ submit->out_fence_fd = NULL;
submit->vfpriv = vfpriv;
submit->vgdev = vgdev;
submit->exbuf = exbuf;
@@ -420,15 +414,15 @@ static int virtio_gpu_init_submit(struct virtio_gpu_submit *submit,
return PTR_ERR(submit->buf);
if (exbuf->flags & VIRTGPU_EXECBUF_FENCE_FD_OUT) {
- err = get_unused_fd_flags(O_CLOEXEC);
- if (err < 0)
- return err;
-
- submit->out_fence_fd = err;
+ submit->out_fence_fd = fd_prepare(O_CLOEXEC);
+ if (IS_ERR(submit->out_fence_fd))
+ return PTR_ERR(submit->out_fence_fd);
submit->sync_file = sync_file_create(&out_fence->f);
if (!submit->sync_file)
return -ENOMEM;
+
+ fd_stage(submit->out_fence_fd, submit->sync_file->file);
}
return 0;
@@ -456,12 +450,10 @@ static int virtio_gpu_wait_in_fence(struct virtio_gpu_submit *submit)
return ret;
}
-static void virtio_gpu_install_out_fence_fd(struct virtio_gpu_submit *submit)
+static void virtio_gpu_report_out_fence_fd(struct virtio_gpu_submit *submit)
{
- if (submit->sync_file) {
- submit->exbuf->fence_fd = submit->out_fence_fd;
- fd_install(submit->out_fence_fd, submit->sync_file->file);
- }
+ if (submit->sync_file)
+ submit->exbuf->fence_fd = fd_prepare_fd(submit->out_fence_fd);
}
static int virtio_gpu_lock_buflist(struct virtio_gpu_submit *submit)
@@ -534,7 +526,7 @@ int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
* Set up user-out data after submitting the job to optimize
* the job submission path.
*/
- virtio_gpu_install_out_fence_fd(&submit);
+ virtio_gpu_report_out_fence_fd(&submit);
virtio_gpu_process_post_deps(&submit);
virtio_gpu_complete_submit(&submit);
cleanup:
--
2.53.0