diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-04-26 16:22:46 +0300 | 
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-04-30 10:50:32 +0200 | 
| commit | 4f42f4ef0dba0cf837b628ac33231a7acb8fcc9d (patch) | |
| tree | b14bc686eb4ff669527d1763ffcda273e983f491 | |
| parent | 43b27290dd42b40f3f23f49677a7faa5a4eb1eff (diff) | |
| download | olio-linux-3.10-4f42f4ef0dba0cf837b628ac33231a7acb8fcc9d.tar.xz olio-linux-3.10-4f42f4ef0dba0cf837b628ac33231a7acb8fcc9d.zip  | |
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>
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 8 | 
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 6be940effef..6165535d15f 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -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:  |