[PATCH 1/4] dma-buf/fence: make timeout handling in fence_default_wait consistent
Christian König
deathsimple at vodafone.de
Wed Oct 26 13:27:25 UTC 2016
Am 26.10.2016 um 10:49 schrieb Chris Wilson:
> On Tue, Oct 25, 2016 at 02:25:08PM +0200, Christian König wrote:
>> From: Christian König <christian.koenig at amd.com>
>>
>> Kernel functions taking a timeout usually return 1 on success even
>> when they get a zero timeout.
> Which? The canonical example of schedule_timeout() doesn't behave like
> this.
wait_event_timeout() for example, as well as to the fence_wait_timeout()
and reservation_object_wait_timeout_rcu() functions build on top of this
one.
Regards,
Christian.
>
>> Signen-off-by: Christian König <christian.koenig at amd.com>
>> Reviewed-by: Chunming Zhou <david1.zhou at amd.com>
>> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
>> ---
>> drivers/dma-buf/fence.c | 8 +++++---
>> 1 file changed, 5 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c
>> index 4d51f9e..fb915ab 100644
>> --- a/drivers/dma-buf/fence.c
>> +++ b/drivers/dma-buf/fence.c
>> @@ -335,18 +335,20 @@ fence_default_wait_cb(struct fence *fence, struct fence_cb *cb)
>> * @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
>> *
>> * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
>> - * remaining timeout in jiffies on success.
>> + * remaining timeout in jiffies on success. If timeout is zero the value one is
>> + * returned if the fence is already signaled for consistency with other
>> + * functions taking a jiffies timeout.
>> */
>> signed long
>> fence_default_wait(struct fence *fence, bool intr, signed long timeout)
>> {
>> struct default_wait_cb cb;
>> unsigned long flags;
>> - signed long ret = timeout;
>> + signed long ret = timeout ? timeout : 1;
>> bool was_set;
> This is horrible.
>
> reservation_object_wait_timeout_rcu(), we pass it a timeout of zero to
> do a safe probe on all attached fences.
>
> The first fence happens to be signaled, so now we set the timeout to 1
> jiffie. Any subsequent incomplete fence will then wait for that jiffie
> before reporting 0.
>
> When we report to userspace, we convert the timeout into an error,
> usually EBUSY or ETIME. Applying that same convention here makes this
> all much cleaner...
> -Chris
>
More information about the dri-devel
mailing list