On 6/16/25 17:59, Tvrtko Ursulin wrote:
> __rcu annotations on the return types from dma_fence_driver_name() and
> dma_fence_timeline_name() cause sparse to complain because both the
> constant signaled strings, and the strings return by the dma_fence_ops are
> not __rcu annotated.
>
> For a simple fix it is easiest to cast them with __rcu added and undo the
> smarts from the tracpoints side of things. There is no functional change
> since the rest is left in place. Later we can consider changing the
> dma_fence_ops return types too, and handle all the individual drivers
> which define them.
>
> Signed-off-by: Tvrtko Ursulin <[email protected]>
> Fixes: 506aa8b02a8d ("dma-fence: Add safe access helpers and document the
> rules")
> Reported-by: kernel test robot <[email protected]>
> Closes:
> https://lore.kernel.org/oe-kbuild-all/[email protected]/
> Cc: Christian König <[email protected]>
Sorry for the delayed reply, completed missed this one.
Patch is reviewed and pushed to drm-misc-next. It eventually will be backported
to stable kernels because of the fixes tag, but since this is not a functional
bug I didn't added a CC:stable tag.
Thanks,
Christian.
> ---
> drivers/dma-buf/dma-fence.c | 8 ++++----
> include/trace/events/dma_fence.h | 35 +++++---------------------------
> 2 files changed, 9 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
> index 3f78c56b58dc..da60d4e68b89 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -1109,9 +1109,9 @@ const char __rcu *dma_fence_driver_name(struct
> dma_fence *fence)
> "RCU protection is required for safe access to
> returned string");
>
> if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
> - return fence->ops->get_driver_name(fence);
> + return (const char __rcu *)fence->ops->get_driver_name(fence);
> else
> - return "detached-driver";
> + return (const char __rcu *)"detached-driver";
> }
> EXPORT_SYMBOL(dma_fence_driver_name);
>
> @@ -1141,8 +1141,8 @@ const char __rcu *dma_fence_timeline_name(struct
> dma_fence *fence)
> "RCU protection is required for safe access to
> returned string");
>
> if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
> - return fence->ops->get_driver_name(fence);
> + return (const char __rcu *)fence->ops->get_driver_name(fence);
> else
> - return "signaled-timeline";
> + return (const char __rcu *)"signaled-timeline";
> }
> EXPORT_SYMBOL(dma_fence_timeline_name);
> diff --git a/include/trace/events/dma_fence.h
> b/include/trace/events/dma_fence.h
> index 4814a65b68dc..3abba45c0601 100644
> --- a/include/trace/events/dma_fence.h
> +++ b/include/trace/events/dma_fence.h
> @@ -9,37 +9,12 @@
>
> struct dma_fence;
>
> -DECLARE_EVENT_CLASS(dma_fence,
> -
> - TP_PROTO(struct dma_fence *fence),
> -
> - TP_ARGS(fence),
> -
> - TP_STRUCT__entry(
> - __string(driver, dma_fence_driver_name(fence))
> - __string(timeline, dma_fence_timeline_name(fence))
> - __field(unsigned int, context)
> - __field(unsigned int, seqno)
> - ),
> -
> - TP_fast_assign(
> - __assign_str(driver);
> - __assign_str(timeline);
> - __entry->context = fence->context;
> - __entry->seqno = fence->seqno;
> - ),
> -
> - TP_printk("driver=%s timeline=%s context=%u seqno=%u",
> - __get_str(driver), __get_str(timeline), __entry->context,
> - __entry->seqno)
> -);
> -
> /*
> * Safe only for call sites which are guaranteed to not race with fence
> * signaling,holding the fence->lock and having checked for not signaled, or
> the
> * signaling path itself.
> */
> -DECLARE_EVENT_CLASS(dma_fence_unsignaled,
> +DECLARE_EVENT_CLASS(dma_fence,
>
> TP_PROTO(struct dma_fence *fence),
>
> @@ -64,14 +39,14 @@ DECLARE_EVENT_CLASS(dma_fence_unsignaled,
> __entry->seqno)
> );
>
> -DEFINE_EVENT(dma_fence_unsignaled, dma_fence_emit,
> +DEFINE_EVENT(dma_fence, dma_fence_emit,
>
> TP_PROTO(struct dma_fence *fence),
>
> TP_ARGS(fence)
> );
>
> -DEFINE_EVENT(dma_fence_unsignaled, dma_fence_init,
> +DEFINE_EVENT(dma_fence, dma_fence_init,
>
> TP_PROTO(struct dma_fence *fence),
>
> @@ -85,14 +60,14 @@ DEFINE_EVENT(dma_fence, dma_fence_destroy,
> TP_ARGS(fence)
> );
>
> -DEFINE_EVENT(dma_fence_unsignaled, dma_fence_enable_signal,
> +DEFINE_EVENT(dma_fence, dma_fence_enable_signal,
>
> TP_PROTO(struct dma_fence *fence),
>
> TP_ARGS(fence)
> );
>
> -DEFINE_EVENT(dma_fence_unsignaled, dma_fence_signaled,
> +DEFINE_EVENT(dma_fence, dma_fence_signaled,
>
> TP_PROTO(struct dma_fence *fence),
>