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)) {