On 11/18/25 17:03, Tvrtko Ursulin wrote:
>>>> @@ -448,13 +465,19 @@ dma_fence_is_signaled_locked(struct dma_fence *fence)
>>>>    static inline bool
>>>>    dma_fence_is_signaled(struct dma_fence *fence)
>>>>    {
>>>> +    const struct dma_fence_ops *ops;
>>>> +
>>>>        if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
>>>>            return true;
>>>>    -    if (fence->ops->signaled && fence->ops->signaled(fence)) {
>>>> +    rcu_read_lock();
>>>> +    ops = rcu_dereference(fence->ops);
>>>> +    if (ops->signaled && ops->signaled(fence)) {
>>>> +        rcu_read_unlock();
>>>
>>> With the unlocked version two threads could race and one could make the 
>>> fence->lock go away just around here, before the dma_fence_signal below 
>>> will take it. It seems it is only safe to rcu_read_unlock before signaling 
>>> if using the embedded fence (later in the series). Can you think of a 
>>> downside to holding the rcu read lock to after signaling? that would make 
>>> it safe I think.
>>
>> Well it's good to talk about it but I think that it is not necessary to 
>> protect the lock in this particular case.
>>
>> See the RCU protection is only for the fence->ops pointer, but the lock can 
>> be taken way after the fence is already signaled.
>>
>> That's why I came up with the patch to move the lock into the fence in the 
>> first place.
> 
> Right. And you think there is nothing to gain with the option of keeping the 
> rcu_read_unlock() to after signalling? Ie. why not plug a potential race if 
> we can for no negative effect.

I thought quite a bit over that, but at least of hand I can't come up with a 
reason why we should do this. The signaling path doesn't need the RCU read side 
lock as far as I can see.

Regards,
Christian.

> 
> Regards,
> 
> Tvrtko

Reply via email to