aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 23f1a6bcee73..292a74f2fa87 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -300,6 +300,7 @@ i915_gem_shmem_pread(struct drm_device *dev,
300 int shmem_page_offset, page_length, ret = 0; 300 int shmem_page_offset, page_length, ret = 0;
301 int obj_do_bit17_swizzling, page_do_bit17_swizzling; 301 int obj_do_bit17_swizzling, page_do_bit17_swizzling;
302 int hit_slowpath = 0; 302 int hit_slowpath = 0;
303 int prefaulted = 0;
303 int needs_clflush = 0; 304 int needs_clflush = 0;
304 int release_page; 305 int release_page;
305 306
@@ -368,6 +369,16 @@ i915_gem_shmem_pread(struct drm_device *dev,
368 page_cache_get(page); 369 page_cache_get(page);
369 mutex_unlock(&dev->struct_mutex); 370 mutex_unlock(&dev->struct_mutex);
370 371
372 if (!prefaulted) {
373 ret = fault_in_pages_writeable(user_data, remain);
374 /* Userspace is tricking us, but we've already clobbered
375 * its pages with the prefault and promised to write the
376 * data up to the first fault. Hence ignore any errors
377 * and just continue. */
378 (void)ret;
379 prefaulted = 1;
380 }
381
371 vaddr = kmap(page); 382 vaddr = kmap(page);
372 if (needs_clflush) 383 if (needs_clflush)
373 drm_clflush_virt_range(vaddr + shmem_page_offset, 384 drm_clflush_virt_range(vaddr + shmem_page_offset,
@@ -431,11 +442,6 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
431 args->size)) 442 args->size))
432 return -EFAULT; 443 return -EFAULT;
433 444
434 ret = fault_in_pages_writeable((char __user *)(uintptr_t)args->data_ptr,
435 args->size);
436 if (ret)
437 return -EFAULT;
438
439 ret = i915_mutex_lock_interruptible(dev); 445 ret = i915_mutex_lock_interruptible(dev);
440 if (ret) 446 if (ret)
441 return ret; 447 return ret;