[PATCH 1/2] dma-buf: make reservation_object_copy_fences rcu save

Christian König deathsimple at vodafone.de
Mon Sep 11 15:22:03 UTC 2017


Am 11.09.2017 um 17:13 schrieb Maarten Lankhorst:
> Op 11-09-17 om 16:45 schreef Christian König:
>> Am 11.09.2017 um 15:56 schrieb Maarten Lankhorst:
>>> Op 11-09-17 om 14:53 schreef Christian König:
>>>> Am 10.09.2017 um 09:30 schrieb Maarten Lankhorst:
>>>> [SNIP]
>> To be honest that looks rather ugly to me for not much gain.
>>
>> Additional to that we loose the optimization I've stolen from the wait function.
> Right now your version does exactly the same as reservation_object_get_fences_rcu,
> but with a reservation_object_list instead of a fence array.

Well then please take a closer look again:
>                 for (i = 0; i < src_list->shared_count; ++i) {
>                         struct dma_fence *fence;
>
>                         fence = rcu_dereference(src_list->shared[i]);
>                         if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
>                                      &fence->flags))
>                                 continue;
>
>                         if (!dma_fence_get_rcu(fence)) {
>                                 kfree(dst_list);
>                                 src_list = rcu_dereference(src->fence);
>                                 goto retry;
>                         }
>
>                         if (dma_fence_is_signaled(fence)) {
>                                 dma_fence_put(fence);
>                                 continue;
>                         }
>
> dst_list->shared[dst_list->shared_count++] = fence;
>                 }

We only take fences into the new reservation list when they aren't 
already signaled.

This can't be added to reservation_object_get_fences_rcu() because that 
would break VM handling on radeon and amdgpu.

Regards,
Christian.


More information about the amd-gfx mailing list