On 12/1/25 11:50, Philipp Stanner wrote: > The overwhelming majority of users of dma_fence signaling functions > don't care about whether the fence had already been signaled by someone > else. Therefore, the return code shall be removed from those functions. > > For the few users who rely on the check, a new, specialized function > shall be provided. > > Add dma_fence_check_and_signal(), which signals a fence if it had not > yet been signaled, and informs the user about that. > > Add a counter part, dma_fence_check_and_signal_locked(), which doesn't > take the spinlock. > > Signed-off-by: Philipp Stanner <[email protected]>
As discussed let's stick with this version for now, it's technical correct and all cleanups can come later as general coding style changes. Reviewed-by: Christian König <[email protected]> > --- > drivers/dma-buf/dma-fence.c | 44 +++++++++++++++++++++++++++++++++++++ > include/linux/dma-fence.h | 2 ++ > 2 files changed, 46 insertions(+) > > diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c > index 96d72ffc0750..146de62887cf 100644 > --- a/drivers/dma-buf/dma-fence.c > +++ b/drivers/dma-buf/dma-fence.c > @@ -445,6 +445,50 @@ int dma_fence_signal_locked(struct dma_fence *fence) > } > EXPORT_SYMBOL(dma_fence_signal_locked); > > +/** > + * dma_fence_check_and_signal_locked - signal the fence if it's not yet > signaled > + * @fence: the fence to check and signal > + * > + * Checks whether a fence was signaled and signals it if it was not yet > signaled. > + * > + * Unlike dma_fence_check_and_signal(), this function must be called with > + * &struct dma_fence.lock being held. > + * > + * Return: true if fence has been signaled already, false otherwise. > + */ > +bool dma_fence_check_and_signal_locked(struct dma_fence *fence) > +{ > + bool ret; > + > + ret = dma_fence_test_signaled_flag(fence); > + dma_fence_signal_locked(fence); > + > + return ret; > +} > +EXPORT_SYMBOL(dma_fence_check_and_signal_locked); > + > +/** > + * dma_fence_check_and_signal - signal the fence if it's not yet signaled > + * @fence: the fence to check and signal > + * > + * Checks whether a fence was signaled and signals it if it was not yet > signaled. > + * All this is done in a race-free manner. > + * > + * Return: true if fence has been signaled already, false otherwise. > + */ > +bool dma_fence_check_and_signal(struct dma_fence *fence) > +{ > + unsigned long flags; > + bool ret; > + > + spin_lock_irqsave(fence->lock, flags); > + ret = dma_fence_check_and_signal_locked(fence); > + spin_unlock_irqrestore(fence->lock, flags); > + > + return ret; > +} > +EXPORT_SYMBOL(dma_fence_check_and_signal); > + > /** > * dma_fence_signal - signal completion of a fence > * @fence: the fence to signal > diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h > index 19972f5d176f..0504afe52c2a 100644 > --- a/include/linux/dma-fence.h > +++ b/include/linux/dma-fence.h > @@ -365,6 +365,8 @@ static inline void __dma_fence_might_wait(void) {} > #endif > > int dma_fence_signal(struct dma_fence *fence); > +bool dma_fence_check_and_signal(struct dma_fence *fence); > +bool dma_fence_check_and_signal_locked(struct dma_fence *fence); > int dma_fence_signal_locked(struct dma_fence *fence); > int dma_fence_signal_timestamp(struct dma_fence *fence, ktime_t timestamp); > int dma_fence_signal_timestamp_locked(struct dma_fence *fence,
