[PATCH RFC POC 44/50] drm/etnaviv: install the out-fence descriptor when the ioctl returns

From: Christian Brauner

Date: Tue Sep 15 2026 - 08:05:53 EST


Rely on the fd exit path machinery.

Signed-off-by: Christian Brauner (Amutable) <brauner@xxxxxxxxxx>
---
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 1a77a09b3377..174f1d66d9ad 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -420,7 +420,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
struct etnaviv_gpu *gpu;
struct sync_file *sync_file = NULL;
struct ww_acquire_ctx ticket;
- int out_fence_fd = -1;
+ const struct fd_slot *out_fence_fd = NULL;
struct pid *pid = get_pid(task_pid(current));
void *stream;
int ret;
@@ -504,9 +504,9 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
}

if (args->flags & ETNA_SUBMIT_FENCE_FD_OUT) {
- out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
- if (out_fence_fd < 0) {
- ret = out_fence_fd;
+ out_fence_fd = fd_prepare(O_CLOEXEC);
+ if (IS_ERR(out_fence_fd)) {
+ ret = PTR_ERR(out_fence_fd);
goto err_submit_cmds;
}
}
@@ -607,10 +607,10 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
*/
goto err_submit_put;
}
- fd_install(out_fence_fd, sync_file->file);
+ fd_stage(out_fence_fd, sync_file->file);
}

- args->fence_fd = out_fence_fd;
+ args->fence_fd = out_fence_fd ? fd_prepare_fd(out_fence_fd) : -1;
args->fence = submit->out_fence_id;

err_submit_job:
@@ -623,8 +623,6 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
ww_acquire_fini(&ticket);

err_submit_cmds:
- if (ret && (out_fence_fd >= 0))
- put_unused_fd(out_fence_fd);
kvfree(stream);
kvfree(bos);
kvfree(relocs);

--
2.53.0