diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 16 |
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; |