From: Rob Clark <robdclark@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: "Rob Clark" <robdclark@chromium.org>,
"Gustavo Padovan" <gustavo@padovan.org>,
"Tvrtko Ursulin" <tvrtko.ursulin@intel.com>,
"Christian König" <ckoenig.leichtzumerken@gmail.com>,
"Michel Dänzer" <michel@daenzer.net>,
"open list" <linux-kernel@vger.kernel.org>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"moderated list:DMA BUFFER SHARING FRAMEWORK"
<linaro-mm-sig@lists.linaro.org>,
"Pekka Paalanen" <ppaalanen@gmail.com>,
"Luben Tuikov" <luben.tuikov@amd.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Alex Deucher" <alexander.deucher@amd.com>,
freedreno@lists.freedesktop.org,
"Christian König" <christian.koenig@amd.com>,
"open list:SYNC FILE FRAMEWORK" <linux-media@vger.kernel.org>
Subject: [PATCH v7 07/15] dma-buf/sw_sync: Add fence deadline support
Date: Mon, 27 Feb 2023 11:35:13 -0800 [thread overview]
Message-ID: <20230227193535.2822389-8-robdclark@gmail.com> (raw)
In-Reply-To: <20230227193535.2822389-1-robdclark@gmail.com>
From: Rob Clark <robdclark@chromium.org>
This consists of simply storing the most recent deadline, and adding an
ioctl to retrieve the deadline. This can be used in conjunction with
the SET_DEADLINE ioctl on a fence fd for testing. Ie. create various
sw_sync fences, merge them into a fence-array, set deadline on the
fence-array and confirm that it is propagated properly to each fence.
v2: Switch UABI to express deadline as u64
v3: More verbose UAPI docs, show how to convert from timespec
Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Christian König <christian.koenig@amd.com>
---
drivers/dma-buf/sw_sync.c | 58 ++++++++++++++++++++++++++++++++++
drivers/dma-buf/sync_debug.h | 2 ++
include/uapi/linux/sync_file.h | 6 +++-
3 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/drivers/dma-buf/sw_sync.c b/drivers/dma-buf/sw_sync.c
index 348b3a9170fa..3e2315ee955b 100644
--- a/drivers/dma-buf/sw_sync.c
+++ b/drivers/dma-buf/sw_sync.c
@@ -52,12 +52,28 @@ struct sw_sync_create_fence_data {
__s32 fence; /* fd of new fence */
};
+/**
+ * struct sw_sync_get_deadline - get the deadline hint of a sw_sync fence
+ * @deadline_ns: absolute time of the deadline
+ * @pad: must be zero
+ * @fence_fd: the sw_sync fence fd (in)
+ *
+ * The timebase for the deadline is CLOCK_MONOTONIC (same as vblank)
+ */
+struct sw_sync_get_deadline {
+ __u64 deadline_ns;
+ __u32 pad;
+ __s32 fence_fd;
+};
+
#define SW_SYNC_IOC_MAGIC 'W'
#define SW_SYNC_IOC_CREATE_FENCE _IOWR(SW_SYNC_IOC_MAGIC, 0,\
struct sw_sync_create_fence_data)
#define SW_SYNC_IOC_INC _IOW(SW_SYNC_IOC_MAGIC, 1, __u32)
+#define SW_SYNC_GET_DEADLINE _IOWR(SW_SYNC_IOC_MAGIC, 2, \
+ struct sw_sync_get_deadline)
static const struct dma_fence_ops timeline_fence_ops;
@@ -171,6 +187,13 @@ static void timeline_fence_timeline_value_str(struct dma_fence *fence,
snprintf(str, size, "%d", parent->value);
}
+static void timeline_fence_set_deadline(struct dma_fence *fence, ktime_t deadline)
+{
+ struct sync_pt *pt = dma_fence_to_sync_pt(fence);
+
+ pt->deadline = deadline;
+}
+
static const struct dma_fence_ops timeline_fence_ops = {
.get_driver_name = timeline_fence_get_driver_name,
.get_timeline_name = timeline_fence_get_timeline_name,
@@ -179,6 +202,7 @@ static const struct dma_fence_ops timeline_fence_ops = {
.release = timeline_fence_release,
.fence_value_str = timeline_fence_value_str,
.timeline_value_str = timeline_fence_timeline_value_str,
+ .set_deadline = timeline_fence_set_deadline,
};
/**
@@ -387,6 +411,37 @@ static long sw_sync_ioctl_inc(struct sync_timeline *obj, unsigned long arg)
return 0;
}
+static int sw_sync_ioctl_get_deadline(struct sync_timeline *obj, unsigned long arg)
+{
+ struct sw_sync_get_deadline data;
+ struct dma_fence *fence;
+ struct sync_pt *pt;
+
+ if (copy_from_user(&data, (void __user *)arg, sizeof(data)))
+ return -EFAULT;
+
+ if (data.deadline_ns || data.pad)
+ return -EINVAL;
+
+ fence = sync_file_get_fence(data.fence_fd);
+ if (!fence)
+ return -EINVAL;
+
+ pt = dma_fence_to_sync_pt(fence);
+ if (!pt)
+ return -EINVAL;
+
+
+ data.deadline_ns = ktime_to_ns(pt->deadline);
+
+ dma_fence_put(fence);
+
+ if (copy_to_user((void __user *)arg, &data, sizeof(data)))
+ return -EFAULT;
+
+ return 0;
+}
+
static long sw_sync_ioctl(struct file *file, unsigned int cmd,
unsigned long arg)
{
@@ -399,6 +454,9 @@ static long sw_sync_ioctl(struct file *file, unsigned int cmd,
case SW_SYNC_IOC_INC:
return sw_sync_ioctl_inc(obj, arg);
+ case SW_SYNC_GET_DEADLINE:
+ return sw_sync_ioctl_get_deadline(obj, arg);
+
default:
return -ENOTTY;
}
diff --git a/drivers/dma-buf/sync_debug.h b/drivers/dma-buf/sync_debug.h
index 6176e52ba2d7..2e0146d0bdbb 100644
--- a/drivers/dma-buf/sync_debug.h
+++ b/drivers/dma-buf/sync_debug.h
@@ -55,11 +55,13 @@ static inline struct sync_timeline *dma_fence_parent(struct dma_fence *fence)
* @base: base fence object
* @link: link on the sync timeline's list
* @node: node in the sync timeline's tree
+ * @deadline: the most recently set fence deadline
*/
struct sync_pt {
struct dma_fence base;
struct list_head link;
struct rb_node node;
+ ktime_t deadline;
};
extern const struct file_operations sw_sync_debugfs_fops;
diff --git a/include/uapi/linux/sync_file.h b/include/uapi/linux/sync_file.h
index 49325cf6749b..dc6645b2598b 100644
--- a/include/uapi/linux/sync_file.h
+++ b/include/uapi/linux/sync_file.h
@@ -72,7 +72,11 @@ struct sync_file_info {
* @deadline_ns: absolute time of the deadline
* @pad: must be zero
*
- * The timebase for the deadline is CLOCK_MONOTONIC (same as vblank)
+ * The timebase for the deadline is CLOCK_MONOTONIC (same as vblank). For
+ * example:
+ *
+ * clock_gettime(CLOCK_MONOTONIC, &t);
+ * deadline_ns = (t.tv_sec * 1000000000L) + t.tv_nsec + duration_ns
*/
struct sync_set_deadline {
__u64 deadline_ns;
--
2.39.1
WARNING: multiple messages have this Message-ID (diff)
From: Rob Clark <robdclark@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: freedreno@lists.freedesktop.org,
"Daniel Vetter" <daniel@ffwll.ch>,
"Christian König" <ckoenig.leichtzumerken@gmail.com>,
"Michel Dänzer" <michel@daenzer.net>,
"Tvrtko Ursulin" <tvrtko.ursulin@intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Alex Deucher" <alexander.deucher@amd.com>,
"Pekka Paalanen" <ppaalanen@gmail.com>,
"Simon Ser" <contact@emersion.fr>,
"Luben Tuikov" <luben.tuikov@amd.com>,
"Rob Clark" <robdclark@chromium.org>,
"Christian König" <christian.koenig@amd.com>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Gustavo Padovan" <gustavo@padovan.org>,
linux-media@vger.kernel.org (open list:SYNC FILE FRAMEWORK),
linaro-mm-sig@lists.linaro.org (moderated list:DMA BUFFER
SHARING FRAMEWORK), linux-kernel@vger.kernel.org (open list)
Subject: [PATCH v7 07/15] dma-buf/sw_sync: Add fence deadline support
Date: Mon, 27 Feb 2023 11:35:13 -0800 [thread overview]
Message-ID: <20230227193535.2822389-8-robdclark@gmail.com> (raw)
In-Reply-To: <20230227193535.2822389-1-robdclark@gmail.com>
From: Rob Clark <robdclark@chromium.org>
This consists of simply storing the most recent deadline, and adding an
ioctl to retrieve the deadline. This can be used in conjunction with
the SET_DEADLINE ioctl on a fence fd for testing. Ie. create various
sw_sync fences, merge them into a fence-array, set deadline on the
fence-array and confirm that it is propagated properly to each fence.
v2: Switch UABI to express deadline as u64
v3: More verbose UAPI docs, show how to convert from timespec
Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Christian König <christian.koenig@amd.com>
---
drivers/dma-buf/sw_sync.c | 58 ++++++++++++++++++++++++++++++++++
drivers/dma-buf/sync_debug.h | 2 ++
include/uapi/linux/sync_file.h | 6 +++-
3 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/drivers/dma-buf/sw_sync.c b/drivers/dma-buf/sw_sync.c
index 348b3a9170fa..3e2315ee955b 100644
--- a/drivers/dma-buf/sw_sync.c
+++ b/drivers/dma-buf/sw_sync.c
@@ -52,12 +52,28 @@ struct sw_sync_create_fence_data {
__s32 fence; /* fd of new fence */
};
+/**
+ * struct sw_sync_get_deadline - get the deadline hint of a sw_sync fence
+ * @deadline_ns: absolute time of the deadline
+ * @pad: must be zero
+ * @fence_fd: the sw_sync fence fd (in)
+ *
+ * The timebase for the deadline is CLOCK_MONOTONIC (same as vblank)
+ */
+struct sw_sync_get_deadline {
+ __u64 deadline_ns;
+ __u32 pad;
+ __s32 fence_fd;
+};
+
#define SW_SYNC_IOC_MAGIC 'W'
#define SW_SYNC_IOC_CREATE_FENCE _IOWR(SW_SYNC_IOC_MAGIC, 0,\
struct sw_sync_create_fence_data)
#define SW_SYNC_IOC_INC _IOW(SW_SYNC_IOC_MAGIC, 1, __u32)
+#define SW_SYNC_GET_DEADLINE _IOWR(SW_SYNC_IOC_MAGIC, 2, \
+ struct sw_sync_get_deadline)
static const struct dma_fence_ops timeline_fence_ops;
@@ -171,6 +187,13 @@ static void timeline_fence_timeline_value_str(struct dma_fence *fence,
snprintf(str, size, "%d", parent->value);
}
+static void timeline_fence_set_deadline(struct dma_fence *fence, ktime_t deadline)
+{
+ struct sync_pt *pt = dma_fence_to_sync_pt(fence);
+
+ pt->deadline = deadline;
+}
+
static const struct dma_fence_ops timeline_fence_ops = {
.get_driver_name = timeline_fence_get_driver_name,
.get_timeline_name = timeline_fence_get_timeline_name,
@@ -179,6 +202,7 @@ static const struct dma_fence_ops timeline_fence_ops = {
.release = timeline_fence_release,
.fence_value_str = timeline_fence_value_str,
.timeline_value_str = timeline_fence_timeline_value_str,
+ .set_deadline = timeline_fence_set_deadline,
};
/**
@@ -387,6 +411,37 @@ static long sw_sync_ioctl_inc(struct sync_timeline *obj, unsigned long arg)
return 0;
}
+static int sw_sync_ioctl_get_deadline(struct sync_timeline *obj, unsigned long arg)
+{
+ struct sw_sync_get_deadline data;
+ struct dma_fence *fence;
+ struct sync_pt *pt;
+
+ if (copy_from_user(&data, (void __user *)arg, sizeof(data)))
+ return -EFAULT;
+
+ if (data.deadline_ns || data.pad)
+ return -EINVAL;
+
+ fence = sync_file_get_fence(data.fence_fd);
+ if (!fence)
+ return -EINVAL;
+
+ pt = dma_fence_to_sync_pt(fence);
+ if (!pt)
+ return -EINVAL;
+
+
+ data.deadline_ns = ktime_to_ns(pt->deadline);
+
+ dma_fence_put(fence);
+
+ if (copy_to_user((void __user *)arg, &data, sizeof(data)))
+ return -EFAULT;
+
+ return 0;
+}
+
static long sw_sync_ioctl(struct file *file, unsigned int cmd,
unsigned long arg)
{
@@ -399,6 +454,9 @@ static long sw_sync_ioctl(struct file *file, unsigned int cmd,
case SW_SYNC_IOC_INC:
return sw_sync_ioctl_inc(obj, arg);
+ case SW_SYNC_GET_DEADLINE:
+ return sw_sync_ioctl_get_deadline(obj, arg);
+
default:
return -ENOTTY;
}
diff --git a/drivers/dma-buf/sync_debug.h b/drivers/dma-buf/sync_debug.h
index 6176e52ba2d7..2e0146d0bdbb 100644
--- a/drivers/dma-buf/sync_debug.h
+++ b/drivers/dma-buf/sync_debug.h
@@ -55,11 +55,13 @@ static inline struct sync_timeline *dma_fence_parent(struct dma_fence *fence)
* @base: base fence object
* @link: link on the sync timeline's list
* @node: node in the sync timeline's tree
+ * @deadline: the most recently set fence deadline
*/
struct sync_pt {
struct dma_fence base;
struct list_head link;
struct rb_node node;
+ ktime_t deadline;
};
extern const struct file_operations sw_sync_debugfs_fops;
diff --git a/include/uapi/linux/sync_file.h b/include/uapi/linux/sync_file.h
index 49325cf6749b..dc6645b2598b 100644
--- a/include/uapi/linux/sync_file.h
+++ b/include/uapi/linux/sync_file.h
@@ -72,7 +72,11 @@ struct sync_file_info {
* @deadline_ns: absolute time of the deadline
* @pad: must be zero
*
- * The timebase for the deadline is CLOCK_MONOTONIC (same as vblank)
+ * The timebase for the deadline is CLOCK_MONOTONIC (same as vblank). For
+ * example:
+ *
+ * clock_gettime(CLOCK_MONOTONIC, &t);
+ * deadline_ns = (t.tv_sec * 1000000000L) + t.tv_nsec + duration_ns
*/
struct sync_set_deadline {
__u64 deadline_ns;
--
2.39.1
next prev parent reply other threads:[~2023-02-27 19:36 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-27 19:35 [Intel-gfx] [PATCH v7 00/15] dma-fence: Deadline awareness Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 01/15] dma-buf/dma-fence: Add deadline awareness Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-28 9:21 ` Pekka Paalanen
2023-02-28 9:21 ` Pekka Paalanen
2023-02-28 17:32 ` Rob Clark
2023-02-28 17:32 ` Rob Clark
2023-03-01 3:50 ` Bagas Sanjaya
2023-03-01 3:50 ` Bagas Sanjaya
2023-02-27 19:35 ` [PATCH v7 02/15] dma-buf/fence-array: Add fence deadline support Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 03/15] dma-buf/fence-chain: " Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 04/15] dma-buf/dma-resv: Add a way to set fence deadline Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 05/15] dma-buf/sync_file: Add SET_DEADLINE ioctl Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-28 9:22 ` Pekka Paalanen
2023-02-28 9:22 ` Pekka Paalanen
2023-02-28 19:37 ` Rob Clark
2023-02-28 19:37 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 06/15] dma-buf/sync_file: Support (E)POLLPRI Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-28 9:22 ` Pekka Paalanen
2023-02-28 9:22 ` Pekka Paalanen
2023-02-27 19:35 ` Rob Clark [this message]
2023-02-27 19:35 ` [PATCH v7 07/15] dma-buf/sw_sync: Add fence deadline support Rob Clark
2023-02-28 9:23 ` Pekka Paalanen
2023-02-28 9:23 ` Pekka Paalanen
2023-02-28 19:47 ` Rob Clark
2023-02-28 19:47 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 08/15] drm/scheduler: " Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 09/15] drm/syncobj: Add deadline support for syncobj waits Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 10/15] drm/vblank: Add helper to get next vblank time Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-28 22:08 ` Mario Kleiner
2023-02-27 19:35 ` [PATCH v7 11/15] drm/atomic-helper: Set fence deadline for vblank Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 12/15] drm/msm: Add deadline based boost support Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 13/15] drm/msm: Add wait-boost support Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [PATCH v7 14/15] drm/msm/atomic: Switch to vblank_start helper Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` [Intel-gfx] [PATCH v7 15/15] drm/i915: Add deadline based boost support Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-27 19:35 ` Rob Clark
2023-02-28 12:42 ` [Intel-gfx] [PATCH v7 00/15] dma-fence: Deadline awareness Bagas Sanjaya
2023-02-28 12:42 ` Bagas Sanjaya
2023-02-28 12:42 ` Bagas Sanjaya
2023-02-28 15:44 ` [Intel-gfx] " Rob Clark
2023-02-28 15:44 ` Rob Clark
2023-02-28 15:44 ` Rob Clark
2023-03-01 2:42 ` [Intel-gfx] " Bagas Sanjaya
2023-03-01 2:42 ` Bagas Sanjaya
2023-03-01 2:42 ` Bagas Sanjaya
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230227193535.2822389-8-robdclark@gmail.com \
--to=robdclark@gmail.com \
--cc=alexander.deucher@amd.com \
--cc=christian.koenig@amd.com \
--cc=ckoenig.leichtzumerken@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=gustavo@padovan.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=luben.tuikov@amd.com \
--cc=michel@daenzer.net \
--cc=ppaalanen@gmail.com \
--cc=robdclark@chromium.org \
--cc=rodrigo.vivi@intel.com \
--cc=sumit.semwal@linaro.org \
--cc=tvrtko.ursulin@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.