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

dma-buf/sync_file: Add SET_DEADLINE ioctl

The initial purpose is for igt tests, but this would also be useful for
compositors that wait until close to vblank deadline to make decisions
about which frame to show.

The igt tests can be found at:

https://gitlab.freedesktop.org/robclark/igt-gpu-tools/-/commits/fence-deadline

v2: Clarify the timebase, add link to igt tests
v3: Use u64 value in ns to express deadline.
v4: More doc

Signed-off-by: Rob Clark <robdclark@chromium.org>
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230823215458.203366-3-robdclark@gmail.com

authored by

Rob Clark and committed by
Dmitry Baryshkov
63ee4454 8570c279

+43 -1
+2 -1
drivers/dma-buf/dma-fence.c
··· 934 934 * the GPU's devfreq to reduce frequency, when in fact the opposite is what is 935 935 * needed. 936 936 * 937 - * To this end, deadline hint(s) can be set on a &dma_fence via &dma_fence_set_deadline. 937 + * To this end, deadline hint(s) can be set on a &dma_fence via &dma_fence_set_deadline 938 + * (or indirectly via userspace facing ioctls like &sync_set_deadline). 938 939 * The deadline hint provides a way for the waiting driver, or userspace, to 939 940 * convey an appropriate sense of urgency to the signaling driver. 940 941 *
+19
drivers/dma-buf/sync_file.c
··· 347 347 return ret; 348 348 } 349 349 350 + static int sync_file_ioctl_set_deadline(struct sync_file *sync_file, 351 + unsigned long arg) 352 + { 353 + struct sync_set_deadline ts; 354 + 355 + if (copy_from_user(&ts, (void __user *)arg, sizeof(ts))) 356 + return -EFAULT; 357 + 358 + if (ts.pad) 359 + return -EINVAL; 360 + 361 + dma_fence_set_deadline(sync_file->fence, ns_to_ktime(ts.deadline_ns)); 362 + 363 + return 0; 364 + } 365 + 350 366 static long sync_file_ioctl(struct file *file, unsigned int cmd, 351 367 unsigned long arg) 352 368 { ··· 374 358 375 359 case SYNC_IOC_FILE_INFO: 376 360 return sync_file_ioctl_fence_info(sync_file, arg); 361 + 362 + case SYNC_IOC_SET_DEADLINE: 363 + return sync_file_ioctl_set_deadline(sync_file, arg); 377 364 378 365 default: 379 366 return -ENOTTY;
+22
include/uapi/linux/sync_file.h
··· 76 76 __u64 sync_fence_info; 77 77 }; 78 78 79 + /** 80 + * struct sync_set_deadline - SYNC_IOC_SET_DEADLINE - set a deadline hint on a fence 81 + * @deadline_ns: absolute time of the deadline 82 + * @pad: must be zero 83 + * 84 + * Allows userspace to set a deadline on a fence, see &dma_fence_set_deadline 85 + * 86 + * The timebase for the deadline is CLOCK_MONOTONIC (same as vblank). For 87 + * example 88 + * 89 + * clock_gettime(CLOCK_MONOTONIC, &t); 90 + * deadline_ns = (t.tv_sec * 1000000000L) + t.tv_nsec + ns_until_deadline 91 + */ 92 + struct sync_set_deadline { 93 + __u64 deadline_ns; 94 + /* Not strictly needed for alignment but gives some possibility 95 + * for future extension: 96 + */ 97 + __u64 pad; 98 + }; 99 + 79 100 #define SYNC_IOC_MAGIC '>' 80 101 81 102 /* ··· 108 87 109 88 #define SYNC_IOC_MERGE _IOWR(SYNC_IOC_MAGIC, 3, struct sync_merge_data) 110 89 #define SYNC_IOC_FILE_INFO _IOWR(SYNC_IOC_MAGIC, 4, struct sync_file_info) 90 + #define SYNC_IOC_SET_DEADLINE _IOW(SYNC_IOC_MAGIC, 5, struct sync_set_deadline) 111 91 112 92 #endif /* _UAPI_LINUX_SYNC_H */