[PATCH 1/2] dma-buf: make reservation_object_copy_fences rcu save
Christian König
deathsimple at vodafone.de
Mon Sep 11 15:24:29 UTC 2017
Am 11.09.2017 um 17:22 schrieb Christian König:
> 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.
What we could do is adding a function to return all fences (including
the exclusive one) as reservation_object_list() and use that in both the
wait as well as the copy function.
Regards,
Christian.
>
> Regards,
> Christian.
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list