Skip to content

Commit 63ee445

Browse files
robclarklumag
authored andcommitted
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
1 parent 8570c27 commit 63ee445

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

drivers/dma-buf/dma-fence.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,8 @@ EXPORT_SYMBOL(dma_fence_wait_any_timeout);
934934
* the GPU's devfreq to reduce frequency, when in fact the opposite is what is
935935
* needed.
936936
*
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).
938939
* The deadline hint provides a way for the waiting driver, or userspace, to
939940
* convey an appropriate sense of urgency to the signaling driver.
940941
*

drivers/dma-buf/sync_file.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,22 @@ static long sync_file_ioctl_fence_info(struct sync_file *sync_file,
347347
return ret;
348348
}
349349

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+
350366
static long sync_file_ioctl(struct file *file, unsigned int cmd,
351367
unsigned long arg)
352368
{
@@ -359,6 +375,9 @@ static long sync_file_ioctl(struct file *file, unsigned int cmd,
359375
case SYNC_IOC_FILE_INFO:
360376
return sync_file_ioctl_fence_info(sync_file, arg);
361377

378+
case SYNC_IOC_SET_DEADLINE:
379+
return sync_file_ioctl_set_deadline(sync_file, arg);
380+
362381
default:
363382
return -ENOTTY;
364383
}

include/uapi/linux/sync_file.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,27 @@ struct sync_file_info {
7676
__u64 sync_fence_info;
7777
};
7878

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+
79100
#define SYNC_IOC_MAGIC '>'
80101

81102
/*
@@ -87,5 +108,6 @@ struct sync_file_info {
87108

88109
#define SYNC_IOC_MERGE _IOWR(SYNC_IOC_MAGIC, 3, struct sync_merge_data)
89110
#define SYNC_IOC_FILE_INFO _IOWR(SYNC_IOC_MAGIC, 4, struct sync_file_info)
111+
#define SYNC_IOC_SET_DEADLINE _IOW(SYNC_IOC_MAGIC, 5, struct sync_set_deadline)
90112

91113
#endif /* _UAPI_LINUX_SYNC_H */

0 commit comments

Comments
 (0)