* [PATCH 0/5] RESEND: dma-buf cleanup
@ 2018-07-04 9:29 Daniel Vetter
2018-07-04 9:29 ` [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops Daniel Vetter
` (3 more replies)
0 siblings, 4 replies; 16+ messages in thread
From: Daniel Vetter @ 2018-07-04 9:29 UTC (permalink / raw)
To: DRI Development; +Cc: Daniel Vetter, Intel Graphics Development
Hi all,
This is a resend of my dma-buf cleanup with the patches that didn't yet
get and ack/r-b. Feedback very much welcome.
Thanks, Daniel
Daniel Vetter (5):
drm/i915: Remove unecessary dma_fence_ops
drm/msm: Remove unecessary dma_fence_ops
drm/nouveau: Remove unecessary dma_fence_ops
drm/vgem: Remove unecessary dma_fence_ops
dma-fence: Polish kernel-doc for dma-fence.c
Documentation/driver-api/dma-buf.rst | 6 +
drivers/dma-buf/dma-fence.c | 147 ++++++++++++------
drivers/gpu/drm/i915/i915_gem_clflush.c | 7 -
.../gpu/drm/i915/selftests/i915_sw_fence.c | 8 -
drivers/gpu/drm/msm/msm_fence.c | 8 -
drivers/gpu/drm/nouveau/nouveau_fence.c | 1 -
drivers/gpu/drm/vgem/vgem_fence.c | 14 --
7 files changed, 109 insertions(+), 82 deletions(-)
--
2.18.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops
2018-07-04 9:29 [PATCH 0/5] RESEND: dma-buf cleanup Daniel Vetter
@ 2018-07-04 9:29 ` Daniel Vetter
2018-07-04 12:03 ` Emil Velikov
[not found] ` <20180704092909.6599-1-daniel.vetter-/w4YWyX8dFk@public.gmane.org>
` (2 subsequent siblings)
3 siblings, 1 reply; 16+ messages in thread
From: Daniel Vetter @ 2018-07-04 9:29 UTC (permalink / raw)
To: DRI Development
Cc: Tvrtko Ursulin, Daniel Vetter, Intel Graphics Development,
Rodrigo Vivi, Colin Ian King, Mika Kuoppala
dma_fence_default_wait is the default now, same for the trivial
enable_signaling implementation.
v2: Also remove the relase hook, dma_fence_free is the default.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Colin Ian King <colin.king@canonical.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: intel-gfx@lists.freedesktop.org
---
drivers/gpu/drm/i915/i915_gem_clflush.c | 7 -------
drivers/gpu/drm/i915/selftests/i915_sw_fence.c | 8 --------
2 files changed, 15 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem_clflush.c b/drivers/gpu/drm/i915/i915_gem_clflush.c
index f5c570d35b2a..8e74c23cbd91 100644
--- a/drivers/gpu/drm/i915/i915_gem_clflush.c
+++ b/drivers/gpu/drm/i915/i915_gem_clflush.c
@@ -45,11 +45,6 @@ static const char *i915_clflush_get_timeline_name(struct dma_fence *fence)
return "clflush";
}
-static bool i915_clflush_enable_signaling(struct dma_fence *fence)
-{
- return true;
-}
-
static void i915_clflush_release(struct dma_fence *fence)
{
struct clflush *clflush = container_of(fence, typeof(*clflush), dma);
@@ -63,8 +58,6 @@ static void i915_clflush_release(struct dma_fence *fence)
static const struct dma_fence_ops i915_clflush_ops = {
.get_driver_name = i915_clflush_get_driver_name,
.get_timeline_name = i915_clflush_get_timeline_name,
- .enable_signaling = i915_clflush_enable_signaling,
- .wait = dma_fence_default_wait,
.release = i915_clflush_release,
};
diff --git a/drivers/gpu/drm/i915/selftests/i915_sw_fence.c b/drivers/gpu/drm/i915/selftests/i915_sw_fence.c
index 570e325af93e..cdbc8f134e5e 100644
--- a/drivers/gpu/drm/i915/selftests/i915_sw_fence.c
+++ b/drivers/gpu/drm/i915/selftests/i915_sw_fence.c
@@ -611,17 +611,9 @@ static const char *mock_name(struct dma_fence *fence)
return "mock";
}
-static bool mock_enable_signaling(struct dma_fence *fence)
-{
- return true;
-}
-
static const struct dma_fence_ops mock_fence_ops = {
.get_driver_name = mock_name,
.get_timeline_name = mock_name,
- .enable_signaling = mock_enable_signaling,
- .wait = dma_fence_default_wait,
- .release = dma_fence_free,
};
static DEFINE_SPINLOCK(mock_fence_lock);
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/5] drm/msm: Remove unecessary dma_fence_ops
[not found] ` <20180704092909.6599-1-daniel.vetter-/w4YWyX8dFk@public.gmane.org>
@ 2018-07-04 9:29 ` Daniel Vetter
2018-07-04 9:29 ` [PATCH 3/5] drm/nouveau: " Daniel Vetter
1 sibling, 0 replies; 16+ messages in thread
From: Daniel Vetter @ 2018-07-04 9:29 UTC (permalink / raw)
To: DRI Development
Cc: Daniel Vetter, Intel Graphics Development,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Rob Clark,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA
dma_fence_default_wait is the default now, same for the trivial
enable_signaling implementation.
v2: Also remove the relase hook, dma_fence_free is the default.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Rob Clark <robdclark@gmail.com>
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
---
drivers/gpu/drm/msm/msm_fence.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/drivers/gpu/drm/msm/msm_fence.c b/drivers/gpu/drm/msm/msm_fence.c
index 349c12f670eb..77263cf97b20 100644
--- a/drivers/gpu/drm/msm/msm_fence.c
+++ b/drivers/gpu/drm/msm/msm_fence.c
@@ -119,11 +119,6 @@ static const char *msm_fence_get_timeline_name(struct dma_fence *fence)
return f->fctx->name;
}
-static bool msm_fence_enable_signaling(struct dma_fence *fence)
-{
- return true;
-}
-
static bool msm_fence_signaled(struct dma_fence *fence)
{
struct msm_fence *f = to_msm_fence(fence);
@@ -133,10 +128,7 @@ static bool msm_fence_signaled(struct dma_fence *fence)
static const struct dma_fence_ops msm_fence_ops = {
.get_driver_name = msm_fence_get_driver_name,
.get_timeline_name = msm_fence_get_timeline_name,
- .enable_signaling = msm_fence_enable_signaling,
.signaled = msm_fence_signaled,
- .wait = dma_fence_default_wait,
- .release = dma_fence_free,
};
struct dma_fence *
--
2.18.0
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/5] drm/nouveau: Remove unecessary dma_fence_ops
[not found] ` <20180704092909.6599-1-daniel.vetter-/w4YWyX8dFk@public.gmane.org>
2018-07-04 9:29 ` [PATCH 2/5] drm/msm: " Daniel Vetter
@ 2018-07-04 9:29 ` Daniel Vetter
1 sibling, 0 replies; 16+ messages in thread
From: Daniel Vetter @ 2018-07-04 9:29 UTC (permalink / raw)
To: DRI Development
Cc: Intel Graphics Development, Ben Skeggs,
nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
dma_fence_default_wait is the default now.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Ben Skeggs <bskeggs@redhat.com>
Cc: nouveau@lists.freedesktop.org
---
drivers/gpu/drm/nouveau/nouveau_fence.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
index 412d49bc6e56..99be61ddeb75 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -526,6 +526,5 @@ static const struct dma_fence_ops nouveau_fence_ops_uevent = {
.get_timeline_name = nouveau_fence_get_timeline_name,
.enable_signaling = nouveau_fence_enable_signaling,
.signaled = nouveau_fence_is_signaled,
- .wait = dma_fence_default_wait,
.release = nouveau_fence_release
};
--
2.18.0
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 4/5] drm/vgem: Remove unecessary dma_fence_ops
2018-07-04 9:29 [PATCH 0/5] RESEND: dma-buf cleanup Daniel Vetter
2018-07-04 9:29 ` [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops Daniel Vetter
[not found] ` <20180704092909.6599-1-daniel.vetter-/w4YWyX8dFk@public.gmane.org>
@ 2018-07-04 9:29 ` Daniel Vetter
2018-08-09 8:33 ` Daniel Vetter
2018-08-09 12:45 ` [PATCH] " Daniel Vetter
2018-07-04 9:29 ` [PATCH 5/5] dma-fence: Polish kernel-doc for dma-fence.c Daniel Vetter
3 siblings, 2 replies; 16+ messages in thread
From: Daniel Vetter @ 2018-07-04 9:29 UTC (permalink / raw)
To: DRI Development
Cc: Daniel Vetter, Intel Graphics Development, Kees Cook,
Cihangir Akturk
dma_fence_default_wait is the default now, same for the trivial
enable_signaling implementation.
Also remove the ->signaled callback, vgem can't peek ahead with a
fastpath, returning false is the default implementation.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Kees Cook <keescook@chromium.org>
Cc: Cihangir Akturk <cakturk@gmail.com>
Cc: Sean Paul <seanpaul@chromium.org>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/vgem/vgem_fence.c | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
index b28876c222b4..75adedeaa384 100644
--- a/drivers/gpu/drm/vgem/vgem_fence.c
+++ b/drivers/gpu/drm/vgem/vgem_fence.c
@@ -43,16 +43,6 @@ static const char *vgem_fence_get_timeline_name(struct dma_fence *fence)
return "unbound";
}
-static bool vgem_fence_signaled(struct dma_fence *fence)
-{
- return false;
-}
-
-static bool vgem_fence_enable_signaling(struct dma_fence *fence)
-{
- return true;
-}
-
static void vgem_fence_release(struct dma_fence *base)
{
struct vgem_fence *fence = container_of(base, typeof(*fence), base);
@@ -76,11 +66,7 @@ static void vgem_fence_timeline_value_str(struct dma_fence *fence, char *str,
static const struct dma_fence_ops vgem_fence_ops = {
.get_driver_name = vgem_fence_get_driver_name,
.get_timeline_name = vgem_fence_get_timeline_name,
- .enable_signaling = vgem_fence_enable_signaling,
- .signaled = vgem_fence_signaled,
- .wait = dma_fence_default_wait,
.release = vgem_fence_release,
-
.fence_value_str = vgem_fence_value_str,
.timeline_value_str = vgem_fence_timeline_value_str,
};
--
2.18.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 5/5] dma-fence: Polish kernel-doc for dma-fence.c
2018-07-04 9:29 [PATCH 0/5] RESEND: dma-buf cleanup Daniel Vetter
` (2 preceding siblings ...)
2018-07-04 9:29 ` [PATCH 4/5] drm/vgem: " Daniel Vetter
@ 2018-07-04 9:29 ` Daniel Vetter
2018-07-04 9:36 ` Christian König
3 siblings, 1 reply; 16+ messages in thread
From: Daniel Vetter @ 2018-07-04 9:29 UTC (permalink / raw)
To: DRI Development
Cc: Daniel Vetter, Intel Graphics Development, linaro-mm-sig,
linux-media
- Intro section that links to how this is exposed to userspace.
- Lots more hyperlinks.
- Minor clarifications and style polish
v2: Add misplaced hunk of kerneldoc from a different patch.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: Gustavo Padovan <gustavo@padovan.org>
Cc: linux-media@vger.kernel.org
Cc: linaro-mm-sig@lists.linaro.org
---
Documentation/driver-api/dma-buf.rst | 6 ++
drivers/dma-buf/dma-fence.c | 147 +++++++++++++++++++--------
2 files changed, 109 insertions(+), 44 deletions(-)
diff --git a/Documentation/driver-api/dma-buf.rst b/Documentation/driver-api/dma-buf.rst
index dc384f2f7f34..b541e97c7ab1 100644
--- a/Documentation/driver-api/dma-buf.rst
+++ b/Documentation/driver-api/dma-buf.rst
@@ -130,6 +130,12 @@ Reservation Objects
DMA Fences
----------
+.. kernel-doc:: drivers/dma-buf/dma-fence.c
+ :doc: DMA fences overview
+
+DMA Fences Functions Reference
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
.. kernel-doc:: drivers/dma-buf/dma-fence.c
:export:
diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
index 7a92f85a4cec..1551ca7df394 100644
--- a/drivers/dma-buf/dma-fence.c
+++ b/drivers/dma-buf/dma-fence.c
@@ -38,12 +38,43 @@ EXPORT_TRACEPOINT_SYMBOL(dma_fence_enable_signal);
*/
static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(0);
+/**
+ * DOC: DMA fences overview
+ *
+ * DMA fences, represented by &struct dma_fence, are the kernel internal
+ * synchronization primitive for DMA operations like GPU rendering, video
+ * encoding/decoding, or displaying buffers on a screen.
+ *
+ * A fence is initialized using dma_fence_init() and completed using
+ * dma_fence_signal(). Fences are associated with a context, allocated through
+ * dma_fence_context_alloc(), and all fences on the same context are
+ * fully ordered.
+ *
+ * Since the purposes of fences is to facilitate cross-device and
+ * cross-application synchronization, there's multiple ways to use one:
+ *
+ * - Individual fences can be exposed as a &sync_file, accessed as a file
+ * descriptor from userspace, created by calling sync_file_create(). This is
+ * called explicit fencing, since userspace passes around explicit
+ * synchronization points.
+ *
+ * - Some subsystems also have their own explicit fencing primitives, like
+ * &drm_syncobj. Compared to &sync_file, a &drm_syncobj allows the underlying
+ * fence to be updated.
+ *
+ * - Then there's also implicit fencing, where the synchronization points are
+ * implicitly passed around as part of shared &dma_buf instances. Such
+ * implicit fences are stored in &struct reservation_object through the
+ * &dma_buf.resv pointer.
+ */
+
/**
* dma_fence_context_alloc - allocate an array of fence contexts
- * @num: [in] amount of contexts to allocate
+ * @num: amount of contexts to allocate
*
- * This function will return the first index of the number of fences allocated.
- * The fence context is used for setting fence->context to a unique number.
+ * This function will return the first index of the number of fence contexts
+ * allocated. The fence context is used for setting &dma_fence.context to a
+ * unique number by passing the context to dma_fence_init().
*/
u64 dma_fence_context_alloc(unsigned num)
{
@@ -59,10 +90,14 @@ EXPORT_SYMBOL(dma_fence_context_alloc);
* Signal completion for software callbacks on a fence, this will unblock
* dma_fence_wait() calls and run all the callbacks added with
* dma_fence_add_callback(). Can be called multiple times, but since a fence
- * can only go from unsignaled to signaled state, it will only be effective
- * the first time.
+ * can only go from the unsignaled to the signaled state and not back, it will
+ * only be effective the first time.
+ *
+ * Unlike dma_fence_signal(), this function must be called with &dma_fence.lock
+ * held.
*
- * Unlike dma_fence_signal, this function must be called with fence->lock held.
+ * Returns 0 on success and a negative error value when @fence has been
+ * signalled already.
*/
int dma_fence_signal_locked(struct dma_fence *fence)
{
@@ -102,8 +137,11 @@ EXPORT_SYMBOL(dma_fence_signal_locked);
* Signal completion for software callbacks on a fence, this will unblock
* dma_fence_wait() calls and run all the callbacks added with
* dma_fence_add_callback(). Can be called multiple times, but since a fence
- * can only go from unsignaled to signaled state, it will only be effective
- * the first time.
+ * can only go from the unsignaled to the signaled state and not back, it will
+ * only be effective the first time.
+ *
+ * Returns 0 on success and a negative error value when @fence has been
+ * signalled already.
*/
int dma_fence_signal(struct dma_fence *fence)
{
@@ -136,9 +174,9 @@ EXPORT_SYMBOL(dma_fence_signal);
/**
* dma_fence_wait_timeout - sleep until the fence gets signaled
* or until timeout elapses
- * @fence: [in] the fence to wait on
- * @intr: [in] if true, do an interruptible wait
- * @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
+ * @fence: the fence to wait on
+ * @intr: if true, do an interruptible wait
+ * @timeout: timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
*
* Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
* remaining timeout in jiffies on success. Other error values may be
@@ -148,6 +186,8 @@ EXPORT_SYMBOL(dma_fence_signal);
* directly or indirectly (buf-mgr between reservation and committing)
* holds a reference to the fence, otherwise the fence might be
* freed before return, resulting in undefined behavior.
+ *
+ * See also dma_fence_wait() and dma_fence_wait_any_timeout().
*/
signed long
dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed long timeout)
@@ -167,6 +207,13 @@ dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed long timeout)
}
EXPORT_SYMBOL(dma_fence_wait_timeout);
+/**
+ * dma_fence_release - default relese function for fences
+ * @kref: &dma_fence.recfount
+ *
+ * This is the default release functions for &dma_fence. Drivers shouldn't call
+ * this directly, but instead call dma_fence_put().
+ */
void dma_fence_release(struct kref *kref)
{
struct dma_fence *fence =
@@ -184,6 +231,13 @@ void dma_fence_release(struct kref *kref)
}
EXPORT_SYMBOL(dma_fence_release);
+/**
+ * dma_fence_free - default release function for &dma_fence.
+ * @fence: fence to release
+ *
+ * This is the default implementation for &dma_fence_ops.release. It calls
+ * kfree_rcu() on @fence.
+ */
void dma_fence_free(struct dma_fence *fence)
{
kfree_rcu(fence, rcu);
@@ -192,10 +246,11 @@ EXPORT_SYMBOL(dma_fence_free);
/**
* dma_fence_enable_sw_signaling - enable signaling on fence
- * @fence: [in] the fence to enable
+ * @fence: the fence to enable
*
- * this will request for sw signaling to be enabled, to make the fence
- * complete as soon as possible
+ * This will request for sw signaling to be enabled, to make the fence
+ * complete as soon as possible. This calls &dma_fence_ops.enable_signaling
+ * internally.
*/
void dma_fence_enable_sw_signaling(struct dma_fence *fence)
{
@@ -220,24 +275,24 @@ EXPORT_SYMBOL(dma_fence_enable_sw_signaling);
/**
* dma_fence_add_callback - add a callback to be called when the fence
* is signaled
- * @fence: [in] the fence to wait on
- * @cb: [in] the callback to register
- * @func: [in] the function to call
+ * @fence: the fence to wait on
+ * @cb: the callback to register
+ * @func: the function to call
*
- * cb will be initialized by dma_fence_add_callback, no initialization
+ * @cb will be initialized by dma_fence_add_callback(), no initialization
* by the caller is required. Any number of callbacks can be registered
* to a fence, but a callback can only be registered to one fence at a time.
*
* Note that the callback can be called from an atomic context. If
* fence is already signaled, this function will return -ENOENT (and
- * *not* call the callback)
+ * *not* call the callback).
*
* Add a software callback to the fence. Same restrictions apply to
- * refcount as it does to dma_fence_wait, however the caller doesn't need to
- * keep a refcount to fence afterwards: when software access is enabled,
- * the creator of the fence is required to keep the fence alive until
- * after it signals with dma_fence_signal. The callback itself can be called
- * from irq context.
+ * refcount as it does to dma_fence_wait(), however the caller doesn't need to
+ * keep a refcount to fence afterward dma_fence_add_callback() has returned:
+ * when software access is enabled, the creator of the fence is required to keep
+ * the fence alive until after it signals with dma_fence_signal(). The callback
+ * itself can be called from irq context.
*
* Returns 0 in case of success, -ENOENT if the fence is already signaled
* and -EINVAL in case of error.
@@ -286,7 +341,7 @@ EXPORT_SYMBOL(dma_fence_add_callback);
/**
* dma_fence_get_status - returns the status upon completion
- * @fence: [in] the dma_fence to query
+ * @fence: the dma_fence to query
*
* This wraps dma_fence_get_status_locked() to return the error status
* condition on a signaled fence. See dma_fence_get_status_locked() for more
@@ -311,8 +366,8 @@ EXPORT_SYMBOL(dma_fence_get_status);
/**
* dma_fence_remove_callback - remove a callback from the signaling list
- * @fence: [in] the fence to wait on
- * @cb: [in] the callback to remove
+ * @fence: the fence to wait on
+ * @cb: the callback to remove
*
* Remove a previously queued callback from the fence. This function returns
* true if the callback is successfully removed, or false if the fence has
@@ -323,6 +378,9 @@ EXPORT_SYMBOL(dma_fence_get_status);
* doing, since deadlocks and race conditions could occur all too easily. For
* this reason, it should only ever be done on hardware lockup recovery,
* with a reference held to the fence.
+ *
+ * Behaviour is undefined if @cb has not been added to @fence using
+ * dma_fence_add_callback() beforehand.
*/
bool
dma_fence_remove_callback(struct dma_fence *fence, struct dma_fence_cb *cb)
@@ -359,9 +417,9 @@ dma_fence_default_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
/**
* dma_fence_default_wait - default sleep until the fence gets signaled
* or until timeout elapses
- * @fence: [in] the fence to wait on
- * @intr: [in] if true, do an interruptible wait
- * @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
+ * @fence: the fence to wait on
+ * @intr: if true, do an interruptible wait
+ * @timeout: timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
*
* Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
* remaining timeout in jiffies on success. If timeout is zero the value one is
@@ -454,12 +512,12 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count,
/**
* dma_fence_wait_any_timeout - sleep until any fence gets signaled
* or until timeout elapses
- * @fences: [in] array of fences to wait on
- * @count: [in] number of fences to wait on
- * @intr: [in] if true, do an interruptible wait
- * @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
- * @idx: [out] the first signaled fence index, meaningful only on
- * positive return
+ * @fences: array of fences to wait on
+ * @count: number of fences to wait on
+ * @intr: if true, do an interruptible wait
+ * @timeout: timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
+ * @idx: used to store the first signaled fence index, meaningful only on
+ * positive return
*
* Returns -EINVAL on custom fence wait implementation, -ERESTARTSYS if
* interrupted, 0 if the wait timed out, or the remaining timeout in jiffies
@@ -468,6 +526,8 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count,
* Synchronous waits for the first fence in the array to be signaled. The
* caller needs to hold a reference to all fences in the array, otherwise a
* fence might be freed before return, resulting in undefined behavior.
+ *
+ * See also dma_fence_wait() and dma_fence_wait_timeout().
*/
signed long
dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
@@ -540,19 +600,18 @@ EXPORT_SYMBOL(dma_fence_wait_any_timeout);
/**
* dma_fence_init - Initialize a custom fence.
- * @fence: [in] the fence to initialize
- * @ops: [in] the dma_fence_ops for operations on this fence
- * @lock: [in] the irqsafe spinlock to use for locking this fence
- * @context: [in] the execution context this fence is run on
- * @seqno: [in] a linear increasing sequence number for this context
+ * @fence: the fence to initialize
+ * @ops: the dma_fence_ops for operations on this fence
+ * @lock: the irqsafe spinlock to use for locking this fence
+ * @context: the execution context this fence is run on
+ * @seqno: a linear increasing sequence number for this context
*
* Initializes an allocated fence, the caller doesn't have to keep its
* refcount after committing with this fence, but it will need to hold a
- * refcount again if dma_fence_ops.enable_signaling gets called. This can
- * be used for other implementing other types of fence.
+ * refcount again if &dma_fence_ops.enable_signaling gets called.
*
* context and seqno are used for easy comparison between fences, allowing
- * to check which fence is later by simply using dma_fence_later.
+ * to check which fence is later by simply using dma_fence_later().
*/
void
dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,
--
2.18.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 5/5] dma-fence: Polish kernel-doc for dma-fence.c
2018-07-04 9:29 ` [PATCH 5/5] dma-fence: Polish kernel-doc for dma-fence.c Daniel Vetter
@ 2018-07-04 9:36 ` Christian König
0 siblings, 0 replies; 16+ messages in thread
From: Christian König @ 2018-07-04 9:36 UTC (permalink / raw)
To: Daniel Vetter, DRI Development
Cc: linaro-mm-sig, Intel Graphics Development, linux-media
Am 04.07.2018 um 11:29 schrieb Daniel Vetter:
> - Intro section that links to how this is exposed to userspace.
> - Lots more hyperlinks.
> - Minor clarifications and style polish
>
> v2: Add misplaced hunk of kerneldoc from a different patch.
>
> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Sumit Semwal <sumit.semwal@linaro.org>
> Cc: Gustavo Padovan <gustavo@padovan.org>
> Cc: linux-media@vger.kernel.org
> Cc: linaro-mm-sig@lists.linaro.org
Reviewed-by: Christian König <christian.koenig@amd.com>
> ---
> Documentation/driver-api/dma-buf.rst | 6 ++
> drivers/dma-buf/dma-fence.c | 147 +++++++++++++++++++--------
> 2 files changed, 109 insertions(+), 44 deletions(-)
>
> diff --git a/Documentation/driver-api/dma-buf.rst b/Documentation/driver-api/dma-buf.rst
> index dc384f2f7f34..b541e97c7ab1 100644
> --- a/Documentation/driver-api/dma-buf.rst
> +++ b/Documentation/driver-api/dma-buf.rst
> @@ -130,6 +130,12 @@ Reservation Objects
> DMA Fences
> ----------
>
> +.. kernel-doc:: drivers/dma-buf/dma-fence.c
> + :doc: DMA fences overview
> +
> +DMA Fences Functions Reference
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> .. kernel-doc:: drivers/dma-buf/dma-fence.c
> :export:
>
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
> index 7a92f85a4cec..1551ca7df394 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -38,12 +38,43 @@ EXPORT_TRACEPOINT_SYMBOL(dma_fence_enable_signal);
> */
> static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(0);
>
> +/**
> + * DOC: DMA fences overview
> + *
> + * DMA fences, represented by &struct dma_fence, are the kernel internal
> + * synchronization primitive for DMA operations like GPU rendering, video
> + * encoding/decoding, or displaying buffers on a screen.
> + *
> + * A fence is initialized using dma_fence_init() and completed using
> + * dma_fence_signal(). Fences are associated with a context, allocated through
> + * dma_fence_context_alloc(), and all fences on the same context are
> + * fully ordered.
> + *
> + * Since the purposes of fences is to facilitate cross-device and
> + * cross-application synchronization, there's multiple ways to use one:
> + *
> + * - Individual fences can be exposed as a &sync_file, accessed as a file
> + * descriptor from userspace, created by calling sync_file_create(). This is
> + * called explicit fencing, since userspace passes around explicit
> + * synchronization points.
> + *
> + * - Some subsystems also have their own explicit fencing primitives, like
> + * &drm_syncobj. Compared to &sync_file, a &drm_syncobj allows the underlying
> + * fence to be updated.
> + *
> + * - Then there's also implicit fencing, where the synchronization points are
> + * implicitly passed around as part of shared &dma_buf instances. Such
> + * implicit fences are stored in &struct reservation_object through the
> + * &dma_buf.resv pointer.
> + */
> +
> /**
> * dma_fence_context_alloc - allocate an array of fence contexts
> - * @num: [in] amount of contexts to allocate
> + * @num: amount of contexts to allocate
> *
> - * This function will return the first index of the number of fences allocated.
> - * The fence context is used for setting fence->context to a unique number.
> + * This function will return the first index of the number of fence contexts
> + * allocated. The fence context is used for setting &dma_fence.context to a
> + * unique number by passing the context to dma_fence_init().
> */
> u64 dma_fence_context_alloc(unsigned num)
> {
> @@ -59,10 +90,14 @@ EXPORT_SYMBOL(dma_fence_context_alloc);
> * Signal completion for software callbacks on a fence, this will unblock
> * dma_fence_wait() calls and run all the callbacks added with
> * dma_fence_add_callback(). Can be called multiple times, but since a fence
> - * can only go from unsignaled to signaled state, it will only be effective
> - * the first time.
> + * can only go from the unsignaled to the signaled state and not back, it will
> + * only be effective the first time.
> + *
> + * Unlike dma_fence_signal(), this function must be called with &dma_fence.lock
> + * held.
> *
> - * Unlike dma_fence_signal, this function must be called with fence->lock held.
> + * Returns 0 on success and a negative error value when @fence has been
> + * signalled already.
> */
> int dma_fence_signal_locked(struct dma_fence *fence)
> {
> @@ -102,8 +137,11 @@ EXPORT_SYMBOL(dma_fence_signal_locked);
> * Signal completion for software callbacks on a fence, this will unblock
> * dma_fence_wait() calls and run all the callbacks added with
> * dma_fence_add_callback(). Can be called multiple times, but since a fence
> - * can only go from unsignaled to signaled state, it will only be effective
> - * the first time.
> + * can only go from the unsignaled to the signaled state and not back, it will
> + * only be effective the first time.
> + *
> + * Returns 0 on success and a negative error value when @fence has been
> + * signalled already.
> */
> int dma_fence_signal(struct dma_fence *fence)
> {
> @@ -136,9 +174,9 @@ EXPORT_SYMBOL(dma_fence_signal);
> /**
> * dma_fence_wait_timeout - sleep until the fence gets signaled
> * or until timeout elapses
> - * @fence: [in] the fence to wait on
> - * @intr: [in] if true, do an interruptible wait
> - * @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
> + * @fence: the fence to wait on
> + * @intr: if true, do an interruptible wait
> + * @timeout: timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
> *
> * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
> * remaining timeout in jiffies on success. Other error values may be
> @@ -148,6 +186,8 @@ EXPORT_SYMBOL(dma_fence_signal);
> * directly or indirectly (buf-mgr between reservation and committing)
> * holds a reference to the fence, otherwise the fence might be
> * freed before return, resulting in undefined behavior.
> + *
> + * See also dma_fence_wait() and dma_fence_wait_any_timeout().
> */
> signed long
> dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed long timeout)
> @@ -167,6 +207,13 @@ dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed long timeout)
> }
> EXPORT_SYMBOL(dma_fence_wait_timeout);
>
> +/**
> + * dma_fence_release - default relese function for fences
> + * @kref: &dma_fence.recfount
> + *
> + * This is the default release functions for &dma_fence. Drivers shouldn't call
> + * this directly, but instead call dma_fence_put().
> + */
> void dma_fence_release(struct kref *kref)
> {
> struct dma_fence *fence =
> @@ -184,6 +231,13 @@ void dma_fence_release(struct kref *kref)
> }
> EXPORT_SYMBOL(dma_fence_release);
>
> +/**
> + * dma_fence_free - default release function for &dma_fence.
> + * @fence: fence to release
> + *
> + * This is the default implementation for &dma_fence_ops.release. It calls
> + * kfree_rcu() on @fence.
> + */
> void dma_fence_free(struct dma_fence *fence)
> {
> kfree_rcu(fence, rcu);
> @@ -192,10 +246,11 @@ EXPORT_SYMBOL(dma_fence_free);
>
> /**
> * dma_fence_enable_sw_signaling - enable signaling on fence
> - * @fence: [in] the fence to enable
> + * @fence: the fence to enable
> *
> - * this will request for sw signaling to be enabled, to make the fence
> - * complete as soon as possible
> + * This will request for sw signaling to be enabled, to make the fence
> + * complete as soon as possible. This calls &dma_fence_ops.enable_signaling
> + * internally.
> */
> void dma_fence_enable_sw_signaling(struct dma_fence *fence)
> {
> @@ -220,24 +275,24 @@ EXPORT_SYMBOL(dma_fence_enable_sw_signaling);
> /**
> * dma_fence_add_callback - add a callback to be called when the fence
> * is signaled
> - * @fence: [in] the fence to wait on
> - * @cb: [in] the callback to register
> - * @func: [in] the function to call
> + * @fence: the fence to wait on
> + * @cb: the callback to register
> + * @func: the function to call
> *
> - * cb will be initialized by dma_fence_add_callback, no initialization
> + * @cb will be initialized by dma_fence_add_callback(), no initialization
> * by the caller is required. Any number of callbacks can be registered
> * to a fence, but a callback can only be registered to one fence at a time.
> *
> * Note that the callback can be called from an atomic context. If
> * fence is already signaled, this function will return -ENOENT (and
> - * *not* call the callback)
> + * *not* call the callback).
> *
> * Add a software callback to the fence. Same restrictions apply to
> - * refcount as it does to dma_fence_wait, however the caller doesn't need to
> - * keep a refcount to fence afterwards: when software access is enabled,
> - * the creator of the fence is required to keep the fence alive until
> - * after it signals with dma_fence_signal. The callback itself can be called
> - * from irq context.
> + * refcount as it does to dma_fence_wait(), however the caller doesn't need to
> + * keep a refcount to fence afterward dma_fence_add_callback() has returned:
> + * when software access is enabled, the creator of the fence is required to keep
> + * the fence alive until after it signals with dma_fence_signal(). The callback
> + * itself can be called from irq context.
> *
> * Returns 0 in case of success, -ENOENT if the fence is already signaled
> * and -EINVAL in case of error.
> @@ -286,7 +341,7 @@ EXPORT_SYMBOL(dma_fence_add_callback);
>
> /**
> * dma_fence_get_status - returns the status upon completion
> - * @fence: [in] the dma_fence to query
> + * @fence: the dma_fence to query
> *
> * This wraps dma_fence_get_status_locked() to return the error status
> * condition on a signaled fence. See dma_fence_get_status_locked() for more
> @@ -311,8 +366,8 @@ EXPORT_SYMBOL(dma_fence_get_status);
>
> /**
> * dma_fence_remove_callback - remove a callback from the signaling list
> - * @fence: [in] the fence to wait on
> - * @cb: [in] the callback to remove
> + * @fence: the fence to wait on
> + * @cb: the callback to remove
> *
> * Remove a previously queued callback from the fence. This function returns
> * true if the callback is successfully removed, or false if the fence has
> @@ -323,6 +378,9 @@ EXPORT_SYMBOL(dma_fence_get_status);
> * doing, since deadlocks and race conditions could occur all too easily. For
> * this reason, it should only ever be done on hardware lockup recovery,
> * with a reference held to the fence.
> + *
> + * Behaviour is undefined if @cb has not been added to @fence using
> + * dma_fence_add_callback() beforehand.
> */
> bool
> dma_fence_remove_callback(struct dma_fence *fence, struct dma_fence_cb *cb)
> @@ -359,9 +417,9 @@ dma_fence_default_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
> /**
> * dma_fence_default_wait - default sleep until the fence gets signaled
> * or until timeout elapses
> - * @fence: [in] the fence to wait on
> - * @intr: [in] if true, do an interruptible wait
> - * @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
> + * @fence: the fence to wait on
> + * @intr: if true, do an interruptible wait
> + * @timeout: timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
> *
> * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
> * remaining timeout in jiffies on success. If timeout is zero the value one is
> @@ -454,12 +512,12 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count,
> /**
> * dma_fence_wait_any_timeout - sleep until any fence gets signaled
> * or until timeout elapses
> - * @fences: [in] array of fences to wait on
> - * @count: [in] number of fences to wait on
> - * @intr: [in] if true, do an interruptible wait
> - * @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
> - * @idx: [out] the first signaled fence index, meaningful only on
> - * positive return
> + * @fences: array of fences to wait on
> + * @count: number of fences to wait on
> + * @intr: if true, do an interruptible wait
> + * @timeout: timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
> + * @idx: used to store the first signaled fence index, meaningful only on
> + * positive return
> *
> * Returns -EINVAL on custom fence wait implementation, -ERESTARTSYS if
> * interrupted, 0 if the wait timed out, or the remaining timeout in jiffies
> @@ -468,6 +526,8 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count,
> * Synchronous waits for the first fence in the array to be signaled. The
> * caller needs to hold a reference to all fences in the array, otherwise a
> * fence might be freed before return, resulting in undefined behavior.
> + *
> + * See also dma_fence_wait() and dma_fence_wait_timeout().
> */
> signed long
> dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
> @@ -540,19 +600,18 @@ EXPORT_SYMBOL(dma_fence_wait_any_timeout);
>
> /**
> * dma_fence_init - Initialize a custom fence.
> - * @fence: [in] the fence to initialize
> - * @ops: [in] the dma_fence_ops for operations on this fence
> - * @lock: [in] the irqsafe spinlock to use for locking this fence
> - * @context: [in] the execution context this fence is run on
> - * @seqno: [in] a linear increasing sequence number for this context
> + * @fence: the fence to initialize
> + * @ops: the dma_fence_ops for operations on this fence
> + * @lock: the irqsafe spinlock to use for locking this fence
> + * @context: the execution context this fence is run on
> + * @seqno: a linear increasing sequence number for this context
> *
> * Initializes an allocated fence, the caller doesn't have to keep its
> * refcount after committing with this fence, but it will need to hold a
> - * refcount again if dma_fence_ops.enable_signaling gets called. This can
> - * be used for other implementing other types of fence.
> + * refcount again if &dma_fence_ops.enable_signaling gets called.
> *
> * context and seqno are used for easy comparison between fences, allowing
> - * to check which fence is later by simply using dma_fence_later.
> + * to check which fence is later by simply using dma_fence_later().
> */
> void
> dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops
2018-07-04 9:29 ` [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops Daniel Vetter
@ 2018-07-04 12:03 ` Emil Velikov
2018-07-04 12:34 ` Daniel Vetter
0 siblings, 1 reply; 16+ messages in thread
From: Emil Velikov @ 2018-07-04 12:03 UTC (permalink / raw)
To: Daniel Vetter
Cc: Intel Graphics Development, DRI Development, Rodrigo Vivi,
Colin Ian King, Mika Kuoppala
Hi Daniel,
On 4 July 2018 at 10:29, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> dma_fence_default_wait is the default now, same for the trivial
> enable_signaling implementation.
>
> v2: Also remove the relase hook, dma_fence_free is the default.
>
> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Jani Nikula <jani.nikula@linux.intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Colin Ian King <colin.king@canonical.com>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Mika Kuoppala <mika.kuoppala@intel.com>
> Cc: intel-gfx@lists.freedesktop.org
> ---
> drivers/gpu/drm/i915/i915_gem_clflush.c | 7 -------
> drivers/gpu/drm/i915/selftests/i915_sw_fence.c | 8 --------
> 2 files changed, 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_clflush.c b/drivers/gpu/drm/i915/i915_gem_clflush.c
> index f5c570d35b2a..8e74c23cbd91 100644
> --- a/drivers/gpu/drm/i915/i915_gem_clflush.c
> +++ b/drivers/gpu/drm/i915/i915_gem_clflush.c
> @@ -45,11 +45,6 @@ static const char *i915_clflush_get_timeline_name(struct dma_fence *fence)
> return "clflush";
> }
>
> -static bool i915_clflush_enable_signaling(struct dma_fence *fence)
> -{
> - return true;
> -}
> -
> static void i915_clflush_release(struct dma_fence *fence)
> {
> struct clflush *clflush = container_of(fence, typeof(*clflush), dma);
> @@ -63,8 +58,6 @@ static void i915_clflush_release(struct dma_fence *fence)
> static const struct dma_fence_ops i915_clflush_ops = {
> .get_driver_name = i915_clflush_get_driver_name,
> .get_timeline_name = i915_clflush_get_timeline_name,
> - .enable_signaling = i915_clflush_enable_signaling,
From a quick look through drm-misc/drm-misc-next removing the
enable_signalling hook may cause functional changes.
Namely:
A call to trace_dma_fence_enable_signal() (in
dma_fence_enable_sw_signaling(), dma_fence_add_callback() and others)
will be omitted.
Removing the default .wait and .release hooks is fine.
HTH
Emil
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops
2018-07-04 12:03 ` Emil Velikov
@ 2018-07-04 12:34 ` Daniel Vetter
2018-07-04 17:22 ` Emil Velikov
0 siblings, 1 reply; 16+ messages in thread
From: Daniel Vetter @ 2018-07-04 12:34 UTC (permalink / raw)
To: Emil Velikov
Cc: Daniel Vetter, Intel Graphics Development, DRI Development,
Rodrigo Vivi, Colin Ian King, Mika Kuoppala
On Wed, Jul 04, 2018 at 01:03:18PM +0100, Emil Velikov wrote:
> Hi Daniel,
>
> On 4 July 2018 at 10:29, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > dma_fence_default_wait is the default now, same for the trivial
> > enable_signaling implementation.
> >
> > v2: Also remove the relase hook, dma_fence_free is the default.
> >
> > Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Cc: Jani Nikula <jani.nikula@linux.intel.com>
> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > Cc: Colin Ian King <colin.king@canonical.com>
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Cc: Mika Kuoppala <mika.kuoppala@intel.com>
> > Cc: intel-gfx@lists.freedesktop.org
> > ---
> > drivers/gpu/drm/i915/i915_gem_clflush.c | 7 -------
> > drivers/gpu/drm/i915/selftests/i915_sw_fence.c | 8 --------
> > 2 files changed, 15 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_gem_clflush.c b/drivers/gpu/drm/i915/i915_gem_clflush.c
> > index f5c570d35b2a..8e74c23cbd91 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_clflush.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_clflush.c
> > @@ -45,11 +45,6 @@ static const char *i915_clflush_get_timeline_name(struct dma_fence *fence)
> > return "clflush";
> > }
> >
> > -static bool i915_clflush_enable_signaling(struct dma_fence *fence)
> > -{
> > - return true;
> > -}
> > -
> > static void i915_clflush_release(struct dma_fence *fence)
> > {
> > struct clflush *clflush = container_of(fence, typeof(*clflush), dma);
> > @@ -63,8 +58,6 @@ static void i915_clflush_release(struct dma_fence *fence)
> > static const struct dma_fence_ops i915_clflush_ops = {
> > .get_driver_name = i915_clflush_get_driver_name,
> > .get_timeline_name = i915_clflush_get_timeline_name,
> > - .enable_signaling = i915_clflush_enable_signaling,
> From a quick look through drm-misc/drm-misc-next removing the
> enable_signalling hook may cause functional changes.
>
> Namely:
> A call to trace_dma_fence_enable_signal() (in
> dma_fence_enable_sw_signaling(), dma_fence_add_callback() and others)
> will be omitted.
I'm not sure what this tracepoint is useful for in the absenve of a real
signaling mechanism that must be enabled (like interrupts).
For all the other bits (begin/end wait, fence signalling itsefl) we have
tracepoints already, so I think we're all covered. What do you think will
be lost with the tracepoint here? If there's a real need for it I think I
can rework the already merged patch to still call the tracpoint, while
avoiding everything else. I just don't see the use-case for that.
-Daniel
>
> Removing the default .wait and .release hooks is fine.
>
> HTH
> Emil
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops
2018-07-04 12:34 ` Daniel Vetter
@ 2018-07-04 17:22 ` Emil Velikov
2018-07-04 20:03 ` Daniel Vetter
0 siblings, 1 reply; 16+ messages in thread
From: Emil Velikov @ 2018-07-04 17:22 UTC (permalink / raw)
To: Daniel Vetter
Cc: Daniel Vetter, Intel Graphics Development, DRI Development,
Rodrigo Vivi, Colin Ian King, Mika Kuoppala
On 4 July 2018 at 13:34, Daniel Vetter <daniel@ffwll.ch> wrote:
> On Wed, Jul 04, 2018 at 01:03:18PM +0100, Emil Velikov wrote:
>> Hi Daniel,
>>
>> On 4 July 2018 at 10:29, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
>> > dma_fence_default_wait is the default now, same for the trivial
>> > enable_signaling implementation.
>> >
>> > v2: Also remove the relase hook, dma_fence_free is the default.
>> >
>> > Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
>> > Cc: Jani Nikula <jani.nikula@linux.intel.com>
>> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
>> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
>> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> > Cc: Colin Ian King <colin.king@canonical.com>
>> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
>> > Cc: Mika Kuoppala <mika.kuoppala@intel.com>
>> > Cc: intel-gfx@lists.freedesktop.org
>> > ---
>> > drivers/gpu/drm/i915/i915_gem_clflush.c | 7 -------
>> > drivers/gpu/drm/i915/selftests/i915_sw_fence.c | 8 --------
>> > 2 files changed, 15 deletions(-)
>> >
>> > diff --git a/drivers/gpu/drm/i915/i915_gem_clflush.c b/drivers/gpu/drm/i915/i915_gem_clflush.c
>> > index f5c570d35b2a..8e74c23cbd91 100644
>> > --- a/drivers/gpu/drm/i915/i915_gem_clflush.c
>> > +++ b/drivers/gpu/drm/i915/i915_gem_clflush.c
>> > @@ -45,11 +45,6 @@ static const char *i915_clflush_get_timeline_name(struct dma_fence *fence)
>> > return "clflush";
>> > }
>> >
>> > -static bool i915_clflush_enable_signaling(struct dma_fence *fence)
>> > -{
>> > - return true;
>> > -}
>> > -
>> > static void i915_clflush_release(struct dma_fence *fence)
>> > {
>> > struct clflush *clflush = container_of(fence, typeof(*clflush), dma);
>> > @@ -63,8 +58,6 @@ static void i915_clflush_release(struct dma_fence *fence)
>> > static const struct dma_fence_ops i915_clflush_ops = {
>> > .get_driver_name = i915_clflush_get_driver_name,
>> > .get_timeline_name = i915_clflush_get_timeline_name,
>> > - .enable_signaling = i915_clflush_enable_signaling,
>> From a quick look through drm-misc/drm-misc-next removing the
>> enable_signalling hook may cause functional changes.
>>
>> Namely:
>> A call to trace_dma_fence_enable_signal() (in
>> dma_fence_enable_sw_signaling(), dma_fence_add_callback() and others)
>> will be omitted.
>
> I'm not sure what this tracepoint is useful for in the absenve of a real
> signaling mechanism that must be enabled (like interrupts).
>
> For all the other bits (begin/end wait, fence signalling itsefl) we have
> tracepoints already, so I think we're all covered. What do you think will
> be lost with the tracepoint here? If there's a real need for it I think I
> can rework the already merged patch to still call the tracpoint, while
> avoiding everything else. I just don't see the use-case for that.
Nothing obvious comes to mind, yet again my knowledge of the fence API
is limited.
Was simply pointing out something that was removed without a small
note covering it.
A fraction of your explanation would have been great, but obviously
not a big deal either way.
Thanks
Emil
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops
2018-07-04 17:22 ` Emil Velikov
@ 2018-07-04 20:03 ` Daniel Vetter
0 siblings, 0 replies; 16+ messages in thread
From: Daniel Vetter @ 2018-07-04 20:03 UTC (permalink / raw)
To: Emil Velikov
Cc: Intel Graphics Development, DRI Development, Rodrigo Vivi,
Colin Ian King, Mika Kuoppala
On Wed, Jul 4, 2018 at 7:22 PM, Emil Velikov <emil.l.velikov@gmail.com> wrote:
> On 4 July 2018 at 13:34, Daniel Vetter <daniel@ffwll.ch> wrote:
>> On Wed, Jul 04, 2018 at 01:03:18PM +0100, Emil Velikov wrote:
>>> Hi Daniel,
>>>
>>> On 4 July 2018 at 10:29, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
>>> > dma_fence_default_wait is the default now, same for the trivial
>>> > enable_signaling implementation.
>>> >
>>> > v2: Also remove the relase hook, dma_fence_free is the default.
>>> >
>>> > Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
>>> > Cc: Jani Nikula <jani.nikula@linux.intel.com>
>>> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>>> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
>>> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
>>> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>> > Cc: Colin Ian King <colin.king@canonical.com>
>>> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
>>> > Cc: Mika Kuoppala <mika.kuoppala@intel.com>
>>> > Cc: intel-gfx@lists.freedesktop.org
>>> > ---
>>> > drivers/gpu/drm/i915/i915_gem_clflush.c | 7 -------
>>> > drivers/gpu/drm/i915/selftests/i915_sw_fence.c | 8 --------
>>> > 2 files changed, 15 deletions(-)
>>> >
>>> > diff --git a/drivers/gpu/drm/i915/i915_gem_clflush.c b/drivers/gpu/drm/i915/i915_gem_clflush.c
>>> > index f5c570d35b2a..8e74c23cbd91 100644
>>> > --- a/drivers/gpu/drm/i915/i915_gem_clflush.c
>>> > +++ b/drivers/gpu/drm/i915/i915_gem_clflush.c
>>> > @@ -45,11 +45,6 @@ static const char *i915_clflush_get_timeline_name(struct dma_fence *fence)
>>> > return "clflush";
>>> > }
>>> >
>>> > -static bool i915_clflush_enable_signaling(struct dma_fence *fence)
>>> > -{
>>> > - return true;
>>> > -}
>>> > -
>>> > static void i915_clflush_release(struct dma_fence *fence)
>>> > {
>>> > struct clflush *clflush = container_of(fence, typeof(*clflush), dma);
>>> > @@ -63,8 +58,6 @@ static void i915_clflush_release(struct dma_fence *fence)
>>> > static const struct dma_fence_ops i915_clflush_ops = {
>>> > .get_driver_name = i915_clflush_get_driver_name,
>>> > .get_timeline_name = i915_clflush_get_timeline_name,
>>> > - .enable_signaling = i915_clflush_enable_signaling,
>>> From a quick look through drm-misc/drm-misc-next removing the
>>> enable_signalling hook may cause functional changes.
>>>
>>> Namely:
>>> A call to trace_dma_fence_enable_signal() (in
>>> dma_fence_enable_sw_signaling(), dma_fence_add_callback() and others)
>>> will be omitted.
>>
>> I'm not sure what this tracepoint is useful for in the absenve of a real
>> signaling mechanism that must be enabled (like interrupts).
>>
>> For all the other bits (begin/end wait, fence signalling itsefl) we have
>> tracepoints already, so I think we're all covered. What do you think will
>> be lost with the tracepoint here? If there's a real need for it I think I
>> can rework the already merged patch to still call the tracpoint, while
>> avoiding everything else. I just don't see the use-case for that.
>
> Nothing obvious comes to mind, yet again my knowledge of the fence API
> is limited.
> Was simply pointing out something that was removed without a small
> note covering it.
>
> A fraction of your explanation would have been great, but obviously
> not a big deal either way.
Yeah would have been good to add to the commit message that made
->enable_signaling optional, but that's now baked into history already
:-/
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 4/5] drm/vgem: Remove unecessary dma_fence_ops
2018-07-04 9:29 ` [PATCH 4/5] drm/vgem: " Daniel Vetter
@ 2018-08-09 8:33 ` Daniel Vetter
2018-08-09 8:38 ` Chris Wilson
2018-08-09 12:45 ` [PATCH] " Daniel Vetter
1 sibling, 1 reply; 16+ messages in thread
From: Daniel Vetter @ 2018-08-09 8:33 UTC (permalink / raw)
To: DRI Development
Cc: Daniel Vetter, Intel Graphics Development, Kees Cook,
Cihangir Akturk
On Wed, Jul 04, 2018 at 11:29:08AM +0200, Daniel Vetter wrote:
> dma_fence_default_wait is the default now, same for the trivial
> enable_signaling implementation.
>
> Also remove the ->signaled callback, vgem can't peek ahead with a
> fastpath, returning false is the default implementation.
>
> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Kees Cook <keescook@chromium.org>
> Cc: Cihangir Akturk <cakturk@gmail.com>
> Cc: Sean Paul <seanpaul@chromium.org>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Anyone feel like reviewing patches 1-4 here?
Thanks, Daniel
> ---
> drivers/gpu/drm/vgem/vgem_fence.c | 14 --------------
> 1 file changed, 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
> index b28876c222b4..75adedeaa384 100644
> --- a/drivers/gpu/drm/vgem/vgem_fence.c
> +++ b/drivers/gpu/drm/vgem/vgem_fence.c
> @@ -43,16 +43,6 @@ static const char *vgem_fence_get_timeline_name(struct dma_fence *fence)
> return "unbound";
> }
>
> -static bool vgem_fence_signaled(struct dma_fence *fence)
> -{
> - return false;
> -}
> -
> -static bool vgem_fence_enable_signaling(struct dma_fence *fence)
> -{
> - return true;
> -}
> -
> static void vgem_fence_release(struct dma_fence *base)
> {
> struct vgem_fence *fence = container_of(base, typeof(*fence), base);
> @@ -76,11 +66,7 @@ static void vgem_fence_timeline_value_str(struct dma_fence *fence, char *str,
> static const struct dma_fence_ops vgem_fence_ops = {
> .get_driver_name = vgem_fence_get_driver_name,
> .get_timeline_name = vgem_fence_get_timeline_name,
> - .enable_signaling = vgem_fence_enable_signaling,
> - .signaled = vgem_fence_signaled,
> - .wait = dma_fence_default_wait,
> .release = vgem_fence_release,
> -
> .fence_value_str = vgem_fence_value_str,
> .timeline_value_str = vgem_fence_timeline_value_str,
> };
> --
> 2.18.0
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 4/5] drm/vgem: Remove unecessary dma_fence_ops
2018-08-09 8:33 ` Daniel Vetter
@ 2018-08-09 8:38 ` Chris Wilson
0 siblings, 0 replies; 16+ messages in thread
From: Chris Wilson @ 2018-08-09 8:38 UTC (permalink / raw)
To: DRI Development, Daniel Vetter
Cc: Daniel Vetter, Intel Graphics Development, Kees Cook,
Cihangir Akturk
Quoting Daniel Vetter (2018-08-09 09:33:49)
> On Wed, Jul 04, 2018 at 11:29:08AM +0200, Daniel Vetter wrote:
> > static void vgem_fence_release(struct dma_fence *base)
> > {
> > struct vgem_fence *fence = container_of(base, typeof(*fence), base);
> > @@ -76,11 +66,7 @@ static void vgem_fence_timeline_value_str(struct dma_fence *fence, char *str,
> > static const struct dma_fence_ops vgem_fence_ops = {
> > .get_driver_name = vgem_fence_get_driver_name,
> > .get_timeline_name = vgem_fence_get_timeline_name,
> > - .enable_signaling = vgem_fence_enable_signaling,
> > - .signaled = vgem_fence_signaled,
> > - .wait = dma_fence_default_wait,
> > .release = vgem_fence_release,
> > -
That space was to separate the interesting ops from the debug!
-Chris
> > .fence_value_str = vgem_fence_value_str,
> > .timeline_value_str = vgem_fence_timeline_value_str,
> > };
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH] drm/vgem: Remove unecessary dma_fence_ops
2018-07-04 9:29 ` [PATCH 4/5] drm/vgem: " Daniel Vetter
2018-08-09 8:33 ` Daniel Vetter
@ 2018-08-09 12:45 ` Daniel Vetter
2018-08-09 12:48 ` Chris Wilson
1 sibling, 1 reply; 16+ messages in thread
From: Daniel Vetter @ 2018-08-09 12:45 UTC (permalink / raw)
To: Intel Graphics Development
Cc: Kees Cook, Daniel Vetter, DRI Development, Cihangir Akturk
dma_fence_default_wait is the default now, same for the trivial
enable_signaling implementation.
Also remove the ->signaled callback, vgem can't peek ahead with a
fastpath, returning false is the default implementation.
v2: Protect the meaningful space! (Chris)
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Kees Cook <keescook@chromium.org>
Cc: Cihangir Akturk <cakturk@gmail.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Sean Paul <seanpaul@chromium.org>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/vgem/vgem_fence.c | 13 -------------
1 file changed, 13 deletions(-)
diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
index b28876c222b4..e6ee71323a66 100644
--- a/drivers/gpu/drm/vgem/vgem_fence.c
+++ b/drivers/gpu/drm/vgem/vgem_fence.c
@@ -43,16 +43,6 @@ static const char *vgem_fence_get_timeline_name(struct dma_fence *fence)
return "unbound";
}
-static bool vgem_fence_signaled(struct dma_fence *fence)
-{
- return false;
-}
-
-static bool vgem_fence_enable_signaling(struct dma_fence *fence)
-{
- return true;
-}
-
static void vgem_fence_release(struct dma_fence *base)
{
struct vgem_fence *fence = container_of(base, typeof(*fence), base);
@@ -76,9 +66,6 @@ static void vgem_fence_timeline_value_str(struct dma_fence *fence, char *str,
static const struct dma_fence_ops vgem_fence_ops = {
.get_driver_name = vgem_fence_get_driver_name,
.get_timeline_name = vgem_fence_get_timeline_name,
- .enable_signaling = vgem_fence_enable_signaling,
- .signaled = vgem_fence_signaled,
- .wait = dma_fence_default_wait,
.release = vgem_fence_release,
.fence_value_str = vgem_fence_value_str,
--
2.18.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH] drm/vgem: Remove unecessary dma_fence_ops
2018-08-09 12:45 ` [PATCH] " Daniel Vetter
@ 2018-08-09 12:48 ` Chris Wilson
2018-08-17 9:23 ` Daniel Vetter
0 siblings, 1 reply; 16+ messages in thread
From: Chris Wilson @ 2018-08-09 12:48 UTC (permalink / raw)
To: Intel Graphics Development
Cc: Daniel Vetter, Kees Cook, DRI Development, Cihangir Akturk
Quoting Daniel Vetter (2018-08-09 13:45:44)
> dma_fence_default_wait is the default now, same for the trivial
> enable_signaling implementation.
>
> Also remove the ->signaled callback, vgem can't peek ahead with a
> fastpath, returning false is the default implementation.
>
> v2: Protect the meaningful space! (Chris)
>
> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Kees Cook <keescook@chromium.org>
> Cc: Cihangir Akturk <cakturk@gmail.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Sean Paul <seanpaul@chromium.org>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
1-4,
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] drm/vgem: Remove unecessary dma_fence_ops
2018-08-09 12:48 ` Chris Wilson
@ 2018-08-17 9:23 ` Daniel Vetter
0 siblings, 0 replies; 16+ messages in thread
From: Daniel Vetter @ 2018-08-17 9:23 UTC (permalink / raw)
To: Chris Wilson
Cc: Kees Cook, Daniel Vetter, Intel Graphics Development,
DRI Development, Cihangir Akturk, Sean Paul
On Thu, Aug 09, 2018 at 01:48:42PM +0100, Chris Wilson wrote:
> Quoting Daniel Vetter (2018-08-09 13:45:44)
> > dma_fence_default_wait is the default now, same for the trivial
> > enable_signaling implementation.
> >
> > Also remove the ->signaled callback, vgem can't peek ahead with a
> > fastpath, returning false is the default implementation.
> >
> > v2: Protect the meaningful space! (Chris)
> >
> > Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Cc: Kees Cook <keescook@chromium.org>
> > Cc: Cihangir Akturk <cakturk@gmail.com>
> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > Cc: Sean Paul <seanpaul@chromium.org>
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
>
> 1-4,
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Thanks for your reviews, all four pushed to drm-misc-next now.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2018-08-17 9:23 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-04 9:29 [PATCH 0/5] RESEND: dma-buf cleanup Daniel Vetter
2018-07-04 9:29 ` [PATCH 1/5] drm/i915: Remove unecessary dma_fence_ops Daniel Vetter
2018-07-04 12:03 ` Emil Velikov
2018-07-04 12:34 ` Daniel Vetter
2018-07-04 17:22 ` Emil Velikov
2018-07-04 20:03 ` Daniel Vetter
[not found] ` <20180704092909.6599-1-daniel.vetter-/w4YWyX8dFk@public.gmane.org>
2018-07-04 9:29 ` [PATCH 2/5] drm/msm: " Daniel Vetter
2018-07-04 9:29 ` [PATCH 3/5] drm/nouveau: " Daniel Vetter
2018-07-04 9:29 ` [PATCH 4/5] drm/vgem: " Daniel Vetter
2018-08-09 8:33 ` Daniel Vetter
2018-08-09 8:38 ` Chris Wilson
2018-08-09 12:45 ` [PATCH] " Daniel Vetter
2018-08-09 12:48 ` Chris Wilson
2018-08-17 9:23 ` Daniel Vetter
2018-07-04 9:29 ` [PATCH 5/5] dma-fence: Polish kernel-doc for dma-fence.c Daniel Vetter
2018-07-04 9:36 ` Christian König
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).