|
@@ -547,6 +547,19 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
|
|
|
struct drm_i915_gem_object *obj_priv;
|
|
|
int ret = 0;
|
|
|
|
|
|
+ if (args->size == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (!access_ok(VERIFY_WRITE,
|
|
|
+ (char __user *)(uintptr_t)args->data_ptr,
|
|
|
+ args->size))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ ret = fault_in_pages_writeable((char __user *)(uintptr_t)args->data_ptr,
|
|
|
+ args->size);
|
|
|
+ if (ret)
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
ret = i915_mutex_lock_interruptible(dev);
|
|
|
if (ret)
|
|
|
return ret;
|
|
@@ -564,23 +577,6 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (args->size == 0)
|
|
|
- goto out;
|
|
|
-
|
|
|
- if (!access_ok(VERIFY_WRITE,
|
|
|
- (char __user *)(uintptr_t)args->data_ptr,
|
|
|
- args->size)) {
|
|
|
- ret = -EFAULT;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- ret = fault_in_pages_writeable((char __user *)(uintptr_t)args->data_ptr,
|
|
|
- args->size);
|
|
|
- if (ret) {
|
|
|
- ret = -EFAULT;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
ret = i915_gem_object_get_pages_or_evict(obj);
|
|
|
if (ret)
|
|
|
goto out;
|
|
@@ -981,7 +977,20 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
|
|
|
struct drm_i915_gem_pwrite *args = data;
|
|
|
struct drm_gem_object *obj;
|
|
|
struct drm_i915_gem_object *obj_priv;
|
|
|
- int ret = 0;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (args->size == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (!access_ok(VERIFY_READ,
|
|
|
+ (char __user *)(uintptr_t)args->data_ptr,
|
|
|
+ args->size))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ ret = fault_in_pages_readable((char __user *)(uintptr_t)args->data_ptr,
|
|
|
+ args->size);
|
|
|
+ if (ret)
|
|
|
+ return -EFAULT;
|
|
|
|
|
|
ret = i915_mutex_lock_interruptible(dev);
|
|
|
if (ret)
|
|
@@ -994,30 +1003,12 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
|
|
|
}
|
|
|
obj_priv = to_intel_bo(obj);
|
|
|
|
|
|
-
|
|
|
/* Bounds check destination. */
|
|
|
if (args->offset > obj->size || args->size > obj->size - args->offset) {
|
|
|
ret = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (args->size == 0)
|
|
|
- goto out;
|
|
|
-
|
|
|
- if (!access_ok(VERIFY_READ,
|
|
|
- (char __user *)(uintptr_t)args->data_ptr,
|
|
|
- args->size)) {
|
|
|
- ret = -EFAULT;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- ret = fault_in_pages_readable((char __user *)(uintptr_t)args->data_ptr,
|
|
|
- args->size);
|
|
|
- if (ret) {
|
|
|
- ret = -EFAULT;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
/* We can only do the GTT pwrite on untiled buffers, as otherwise
|
|
|
* it would end up going through the fenced access, and we'll get
|
|
|
* different detiling behavior between reading and writing.
|