git: c90c46ea239f - main - linux: add dma-buf and sync_file ioctl handlers
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 19 Aug 2026 00:03:57 UTC
The branch main has been updated by nprice:
URL: https://cgit.FreeBSD.org/src/commit/?id=c90c46ea239f2514f1af82c1fa9dc0b4f20361e7
commit c90c46ea239f2514f1af82c1fa9dc0b4f20361e7
Author: Nick Price <nprice@FreeBSD.org>
AuthorDate: 2026-08-09 23:43:12 +0000
Commit: Nick Price <nprice@FreeBSD.org>
CommitDate: 2026-08-19 00:02:26 +0000
linux: add dma-buf and sync_file ioctl handlers
drm-kmod already implements the dma-buf and sync_file ioctls, but
linux_ioctl.c had no handler group for the 'b' and '>' magic bytes, so
the requests never reached it and returned EINVAL from
linux_ioctl_fallback(). Route the commands drm-kmod services to
sys_ioctl(), translating the direction bits with SETDIR(); everything
else still falls through to the fallback and keeps getting named in
dmesg.
Approved-by: adrian
Accepted-by: dumbbell
Signed-off-by: Nick Price <nprice@FreeBSD.org>
(cherry picked from commit d6a7e89504af337413af39fd121026f512c0a35d)
---
sys/compat/linux/linux_ioctl.c | 38 ++++++++++++++++++++++++++++++++++++++
sys/compat/linux/linux_ioctl.h | 20 ++++++++++++++++++++
2 files changed, 58 insertions(+)
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index b68e950a2dcf..dd261aeca56d 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -108,6 +108,8 @@ DEFINE_LINUX_IOCTL_SET(sound, SOUND);
DEFINE_LINUX_IOCTL_SET(termio, TERMIO);
DEFINE_LINUX_IOCTL_SET(private, PRIVATE);
DEFINE_LINUX_IOCTL_SET(drm, DRM);
+DEFINE_LINUX_IOCTL_SET(dmabuf, DMABUF);
+DEFINE_LINUX_IOCTL_SET(syncfile, SYNCFILE);
DEFINE_LINUX_IOCTL_SET(sg, SG);
DEFINE_LINUX_IOCTL_SET(v4l, VIDEO);
DEFINE_LINUX_IOCTL_SET(v4l2, VIDEO2);
@@ -2579,6 +2581,42 @@ linux_ioctl_drm(struct thread *td, struct linux_ioctl_args *args)
return (sys_ioctl(td, (struct ioctl_args *)args));
}
+/*
+ * dma-buf ioctl handler (drm-kmod)
+ */
+static int
+linux_ioctl_dmabuf(struct thread *td, struct linux_ioctl_args *args)
+{
+
+ switch (args->cmd & 0xffff) {
+ case LINUX_DMA_BUF_IOCTL_SYNC:
+ case LINUX_DMA_BUF_IOCTL_EXPORT_SYNC_FILE:
+ case LINUX_DMA_BUF_IOCTL_IMPORT_SYNC_FILE:
+ args->cmd = SETDIR(args->cmd);
+ return (sys_ioctl(td, (struct ioctl_args *)args));
+ }
+
+ return (ENOIOCTL);
+}
+
+/*
+ * sync_file ioctl handler (drm-kmod)
+ */
+static int
+linux_ioctl_syncfile(struct thread *td, struct linux_ioctl_args *args)
+{
+
+ switch (args->cmd & 0xffff) {
+ case LINUX_SYNC_IOC_MERGE:
+ case LINUX_SYNC_IOC_FILE_INFO:
+ case LINUX_SYNC_IOC_SET_DEADLINE:
+ args->cmd = SETDIR(args->cmd);
+ return (sys_ioctl(td, (struct ioctl_args *)args));
+ }
+
+ return (ENOIOCTL);
+}
+
#ifdef COMPAT_LINUX32
static int
linux_ioctl_sg_io(struct thread *td, struct linux_ioctl_args *args)
diff --git a/sys/compat/linux/linux_ioctl.h b/sys/compat/linux/linux_ioctl.h
index 769f56b7de51..5585f7e866fe 100644
--- a/sys/compat/linux/linux_ioctl.h
+++ b/sys/compat/linux/linux_ioctl.h
@@ -622,6 +622,26 @@
#define LINUX_IOCTL_DRM_MIN 0x6400
#define LINUX_IOCTL_DRM_MAX 0x64ff
+/*
+ * dma-buf
+ */
+#define LINUX_DMA_BUF_IOCTL_SYNC 0x6200
+#define LINUX_DMA_BUF_IOCTL_EXPORT_SYNC_FILE 0x6202
+#define LINUX_DMA_BUF_IOCTL_IMPORT_SYNC_FILE 0x6203
+
+#define LINUX_IOCTL_DMABUF_MIN 0x6200
+#define LINUX_IOCTL_DMABUF_MAX 0x62ff
+
+/*
+ * sync_file
+ */
+#define LINUX_SYNC_IOC_MERGE 0x3e03
+#define LINUX_SYNC_IOC_FILE_INFO 0x3e04
+#define LINUX_SYNC_IOC_SET_DEADLINE 0x3e05
+
+#define LINUX_IOCTL_SYNCFILE_MIN 0x3e00
+#define LINUX_IOCTL_SYNCFILE_MAX 0x3eff
+
/*
* video
*/