drm/i915: Always normalize return timeout for wait_timeout_ioctl
As we recompute the remaining timeout after waiting, there is a potential for that timeout to be less than zero and so need sanitizing. The timeout is always returned to userspace and validated, so we should always perform the sanitation. v2 [vsyrjala]: Only normalize the timespec if it's invalid v3: Add a comment to clarify the situation and remove the now useless WARN_ON() (ickle) Cc: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Tested-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
Родитель
43b27290dd
Коммит
4f42f4ef0d
|
@ -1045,6 +1045,8 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
|
|||
if (timeout) {
|
||||
struct timespec sleep_time = timespec_sub(now, before);
|
||||
*timeout = timespec_sub(*timeout, sleep_time);
|
||||
if (!timespec_valid(timeout)) /* i.e. negative time remains */
|
||||
set_normalized_timespec(timeout, 0, 0);
|
||||
}
|
||||
|
||||
switch (end) {
|
||||
|
@ -1053,8 +1055,6 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
|
|||
case -ERESTARTSYS: /* Signal */
|
||||
return (int)end;
|
||||
case 0: /* Timeout */
|
||||
if (timeout)
|
||||
set_normalized_timespec(timeout, 0, 0);
|
||||
return -ETIME;
|
||||
default: /* Completed */
|
||||
WARN_ON(end < 0); /* We're not aware of other errors */
|
||||
|
@ -2377,10 +2377,8 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
|||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
ret = __wait_seqno(ring, seqno, reset_counter, true, timeout);
|
||||
if (timeout) {
|
||||
WARN_ON(!timespec_valid(timeout));
|
||||
if (timeout)
|
||||
args->timeout_ns = timespec_to_ns(timeout);
|
||||
}
|
||||
return ret;
|
||||
|
||||
out:
|
||||
|
|
Загрузка…
Ссылка в новой задаче