On Wed, Apr 26, 2017 at 01:28:30PM +1000, Dave Airlie wrote:
> +/**
> + * calc_timeout - calculate jiffies timeout from absolute value
> + *
> + * @timeout_ns: timeout in ns
> + *
> + * Calculate the timeout in jiffies from an absolute timeout in ns.
> + */
> +unsigned long calc_wait_timeout(uint64_t timeout_ns)
> +{
> +        unsigned long timeout_jiffies;
> +        ktime_t timeout;
> +
> +        /* clamp timeout if it's to large */
> +        if (((int64_t)timeout_ns) < 0)
> +                return MAX_SCHEDULE_TIMEOUT;
> +
> +        timeout = ktime_sub(ns_to_ktime(timeout_ns), ktime_get());
> +        if (ktime_to_ns(timeout) < 0)
> +                return 0;
> +
> +        timeout_jiffies = nsecs_to_jiffies(ktime_to_ns(timeout));
> +        /*  clamp timeout to avoid unsigned-> signed overflow */
> +        if (timeout_jiffies > MAX_SCHEDULE_TIMEOUT )
> +                return MAX_SCHEDULE_TIMEOUT - 1;
> +
> +        return timeout_jiffies;
> +}
> +
> +static int drm_syncobj_wait_all_fences(struct drm_device *dev,
> +                                    struct drm_file *file_private,
> +                                    struct drm_syncobj_wait *wait,
> +                                    uint32_t *handles)
> +{
> +     uint32_t i;
> +     int ret;
> +
> +     for (i = 0; i < wait->count_handles; i++) {
> +             unsigned long timeout = calc_wait_timeout(wait->timeout_ns);
> +             struct dma_fence *fence;
> +
> +             ret = drm_syncobj_fence_get(file_private, handles[i],
> +                                         &fence);
> +             if (ret)
> +                     return ret;
> +
> +             if (!fence)
> +                     continue;
> +
> +             ret = dma_fence_wait_timeout(fence, true, timeout);

We are resetting the timeout for each wait, and do not report the
remaining time back to the user. Useful for handling SIGINT and keeping
the maximum waittime intact.

> +             dma_fence_put(fence);
> +             if (ret < 0)
> +                     return ret;
> +             if (ret == 0)
> +                     break;
> +     }
> +
> +     wait->out_status = (ret > 0);
> +     wait->first_signaled = 0;
> +     return 0;
> +}

-- 
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to