diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-09-26 15:23:38 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-10-04 05:07:46 -0400 |
commit | 35b62a89b0723ca05831f2edfff6deebe1806f21 (patch) | |
tree | 39a62777f29a4c814991d317b83562ccda961f41 /drivers | |
parent | df6d075a4d8b151f2c011de01c09bdc92a7bb935 (diff) |
drm/i915: Skip pread/pwrite if size to copy is 0.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index dba82022bd3e..29e97c075421 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -576,7 +576,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, | |||
576 | struct drm_i915_gem_pread *args = data; | 576 | struct drm_i915_gem_pread *args = data; |
577 | struct drm_gem_object *obj; | 577 | struct drm_gem_object *obj; |
578 | struct drm_i915_gem_object *obj_priv; | 578 | struct drm_i915_gem_object *obj_priv; |
579 | int ret; | 579 | int ret = 0; |
580 | 580 | ||
581 | obj = drm_gem_object_lookup(dev, file_priv, args->handle); | 581 | obj = drm_gem_object_lookup(dev, file_priv, args->handle); |
582 | if (obj == NULL) | 582 | if (obj == NULL) |
@@ -586,14 +586,17 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, | |||
586 | /* Bounds check source. */ | 586 | /* Bounds check source. */ |
587 | if (args->offset > obj->size || args->size > obj->size - args->offset) { | 587 | if (args->offset > obj->size || args->size > obj->size - args->offset) { |
588 | ret = -EINVAL; | 588 | ret = -EINVAL; |
589 | goto err; | 589 | goto out; |
590 | } | 590 | } |
591 | 591 | ||
592 | if (args->size == 0) | ||
593 | goto out; | ||
594 | |||
592 | if (!access_ok(VERIFY_WRITE, | 595 | if (!access_ok(VERIFY_WRITE, |
593 | (char __user *)(uintptr_t)args->data_ptr, | 596 | (char __user *)(uintptr_t)args->data_ptr, |
594 | args->size)) { | 597 | args->size)) { |
595 | ret = -EFAULT; | 598 | ret = -EFAULT; |
596 | goto err; | 599 | goto out; |
597 | } | 600 | } |
598 | 601 | ||
599 | if (i915_gem_object_needs_bit17_swizzle(obj)) { | 602 | if (i915_gem_object_needs_bit17_swizzle(obj)) { |
@@ -605,7 +608,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, | |||
605 | file_priv); | 608 | file_priv); |
606 | } | 609 | } |
607 | 610 | ||
608 | err: | 611 | out: |
609 | drm_gem_object_unreference_unlocked(obj); | 612 | drm_gem_object_unreference_unlocked(obj); |
610 | return ret; | 613 | return ret; |
611 | } | 614 | } |
@@ -1059,14 +1062,17 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, | |||
1059 | /* Bounds check destination. */ | 1062 | /* Bounds check destination. */ |
1060 | if (args->offset > obj->size || args->size > obj->size - args->offset) { | 1063 | if (args->offset > obj->size || args->size > obj->size - args->offset) { |
1061 | ret = -EINVAL; | 1064 | ret = -EINVAL; |
1062 | goto err; | 1065 | goto out; |
1063 | } | 1066 | } |
1064 | 1067 | ||
1068 | if (args->size == 0) | ||
1069 | goto out; | ||
1070 | |||
1065 | if (!access_ok(VERIFY_READ, | 1071 | if (!access_ok(VERIFY_READ, |
1066 | (char __user *)(uintptr_t)args->data_ptr, | 1072 | (char __user *)(uintptr_t)args->data_ptr, |
1067 | args->size)) { | 1073 | args->size)) { |
1068 | ret = -EFAULT; | 1074 | ret = -EFAULT; |
1069 | goto err; | 1075 | goto out; |
1070 | } | 1076 | } |
1071 | 1077 | ||
1072 | /* We can only do the GTT pwrite on untiled buffers, as otherwise | 1078 | /* We can only do the GTT pwrite on untiled buffers, as otherwise |
@@ -1100,7 +1106,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, | |||
1100 | DRM_INFO("pwrite failed %d\n", ret); | 1106 | DRM_INFO("pwrite failed %d\n", ret); |
1101 | #endif | 1107 | #endif |
1102 | 1108 | ||
1103 | err: | 1109 | out: |
1104 | drm_gem_object_unreference_unlocked(obj); | 1110 | drm_gem_object_unreference_unlocked(obj); |
1105 | return ret; | 1111 | return ret; |
1106 | } | 1112 | } |