git: c90c46ea239f - main - linux: add dma-buf and sync_file ioctl handlers

From: Nick Price <nprice_at_FreeBSD.org>
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
  */