Some parties want to check whether a function is already signaled
without actually signaling the fence, which is what
dma_fence_is_signaled() might due if the fence ops 'signaled' callback
is implemented.
Add __dma_fence_is_signaled(), which _only_ checks whether a fence is
signaled. Use it internally.
Suggested-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
Signed-off-by: Philipp Stanner <phasta at kernel.org>
---
include/linux/dma-fence.h | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
index 48b5202c531d..ac951a54a007 100644
--- a/include/linux/dma-fence.h
+++ b/include/linux/dma-fence.h
@@ -381,6 +381,26 @@ bool dma_fence_remove_callback(struct dma_fence *fence,
struct dma_fence_cb *cb);
void dma_fence_enable_sw_signaling(struct dma_fence *fence);
+/**
+ * __dma_fence_is_signaled - Only check whether a fence is signaled yet.
+ * @fence: the fence to check
+ *
+ * This function just checks whether @fence is signaled, without interacting
+ * with the fence in any way. The user must, therefore, ensure through other
+ * means that fences get signaled eventually.
+ *
+ * This function does not require locking.
+ *
+ * See also dma_fence_is_signaled().
+ *
+ * Return: true if signaled, false otherwise.
+ */
+static inline bool
+__dma_fence_is_signaled(struct dma_fence *fence)
+{
+ return test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags);
+}
+
/**
* dma_fence_is_signaled_locked - Return an indication if the fence
* is signaled yet.
@@ -398,7 +418,7 @@ void dma_fence_enable_sw_signaling(struct dma_fence *fence);
static inline bool
dma_fence_is_signaled_locked(struct dma_fence *fence)
{
- if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+ if (__dma_fence_is_signaled(fence))
return true;
if (fence->ops->signaled && fence->ops->signaled(fence)) {
@@ -428,7 +448,7 @@ dma_fence_is_signaled_locked(struct dma_fence *fence)
static inline bool
dma_fence_is_signaled(struct dma_fence *fence)
{
- if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
+ if (__dma_fence_is_signaled(fence))
return true;
if (fence->ops->signaled && fence->ops->signaled(fence)) {
--
2.49.0
Philipp Stanner
2025-May-22 11:25 UTC
[PATCH 2/2] drm/nouveau: Don't signal when killing the fence context
dma_fence_is_signaled_locked(), which is used in
nouveau_fence_context_kill(), can signal fences below the surface
through a callback.
There is neither need for nor use in doing that when killing a fence
context.
Replace dma_fence_is_signaled_locked() with __dma_fence_is_signaled(), a
function which only checks, never signals.
Signed-off-by: Philipp Stanner <phasta at kernel.org>
---
drivers/gpu/drm/nouveau/nouveau_fence.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c
b/drivers/gpu/drm/nouveau/nouveau_fence.c
index d5654e26d5bc..993b3dcb5db0 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -88,7 +88,7 @@ nouveau_fence_context_kill(struct nouveau_fence_chan *fctx,
int error)
spin_lock_irqsave(&fctx->lock, flags);
list_for_each_entry_safe(fence, tmp, &fctx->pending, head) {
- if (error && !dma_fence_is_signaled_locked(&fence->base))
+ if (error && !__dma_fence_is_signaled(&fence->base))
dma_fence_set_error(&fence->base, error);
if (nouveau_fence_signal(fence))
--
2.49.0
On 22/05/2025 12:25, Philipp Stanner wrote:> Some parties want to check whether a function is already signaled > without actually signaling the fence, which is what > dma_fence_is_signaled() might due if the fence ops 'signaled' callbacks/due/do/> is implemented. > > Add __dma_fence_is_signaled(), which _only_ checks whether a fence is > signaled. Use it internally. > > Suggested-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com> > Signed-off-by: Philipp Stanner <phasta at kernel.org> > --- > include/linux/dma-fence.h | 24 ++++++++++++++++++++++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h > index 48b5202c531d..ac951a54a007 100644 > --- a/include/linux/dma-fence.h > +++ b/include/linux/dma-fence.h > @@ -381,6 +381,26 @@ bool dma_fence_remove_callback(struct dma_fence *fence, > struct dma_fence_cb *cb); > void dma_fence_enable_sw_signaling(struct dma_fence *fence); > > +/** > + * __dma_fence_is_signaled - Only check whether a fence is signaled yet. > + * @fence: the fence to check > + * > + * This function just checks whether @fence is signaled, without interacting > + * with the fence in any way. The user must, therefore, ensure through others/user/caller/ ? Otherwise looks good to me. For if/when Christian approves you can add my: Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com> Regards, Tvrtko> + * means that fences get signaled eventually. > + * > + * This function does not require locking. > + * > + * See also dma_fence_is_signaled(). > + * > + * Return: true if signaled, false otherwise. > + */ > +static inline bool > +__dma_fence_is_signaled(struct dma_fence *fence) > +{ > + return test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags); > +} > + > /** > * dma_fence_is_signaled_locked - Return an indication if the fence > * is signaled yet. > @@ -398,7 +418,7 @@ void dma_fence_enable_sw_signaling(struct dma_fence *fence); > static inline bool > dma_fence_is_signaled_locked(struct dma_fence *fence) > { > - if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) > + if (__dma_fence_is_signaled(fence)) > return true; > > if (fence->ops->signaled && fence->ops->signaled(fence)) { > @@ -428,7 +448,7 @@ dma_fence_is_signaled_locked(struct dma_fence *fence) > static inline bool > dma_fence_is_signaled(struct dma_fence *fence) > { > - if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) > + if (__dma_fence_is_signaled(fence)) > return true; > > if (fence->ops->signaled && fence->ops->signaled(fence)) {