[PATCH 49/54] fast-madv-ioctl

Chris Wilson chris at chris-wilson.co.uk
Sun Jun 4 12:08:32 UTC 2017


---
 drivers/gpu/drm/i915/i915_drv.c |  2 +-
 drivers/gpu/drm/i915/i915_drv.h |  5 +++--
 drivers/gpu/drm/i915/i915_gem.c | 41 +++++++++++++++++++++++++++++------------
 3 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index fc663f902683..4bd88294238d 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -2566,7 +2566,7 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
 	DRM_DRIVER_IOCTL_DEF(I915_GEM_GET_TILING, i915_gem_get_tiling_ioctl, DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_GEM_GET_APERTURE, i915_gem_get_aperture_ioctl, DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_GET_PIPE_FROM_CRTC_ID, intel_get_pipe_from_crtc_id, 0),
-	DRM_IOCTL_DEF_DRV(I915_GEM_MADVISE, i915_gem_madvise_ioctl, DRM_RENDER_ALLOW),
+	DRM_DRIVER_IOCTL_DEF(I915_GEM_MADVISE, i915_gem_madvise_ioctl, DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_OVERLAY_PUT_IMAGE, intel_overlay_put_image_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_OVERLAY_ATTRS, intel_overlay_attrs_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_SET_SPRITE_COLORKEY, intel_sprite_set_colorkey, DRM_MASTER|DRM_CONTROL_ALLOW),
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 7d266802fa1d..2cea49a69d1b 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3220,8 +3220,9 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
 long i915_gem_throttle_ioctl(struct file *filp,
 			     unsigned int cmd,
 			     unsigned long data);
-int i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
-			   struct drm_file *file_priv);
+long i915_gem_madvise_ioctl(struct file *filp,
+			    unsigned int cmd,
+			    unsigned long data);
 int i915_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
 			      struct drm_file *file_priv);
 long i915_gem_get_tiling_ioctl(struct file *filp,
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 1be8a08e3e64..cbf2f324a4c2 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4309,16 +4309,25 @@ long i915_gem_busy_ioctl(struct file *filp,
 }
 
 
-int
-i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
-		       struct drm_file *file_priv)
+long
+i915_gem_madvise_ioctl(struct file *filp,
+		       unsigned int cmd,
+		       unsigned long data)
 {
-	struct drm_i915_private *dev_priv = to_i915(dev);
-	struct drm_i915_gem_madvise *args = data;
+	struct drm_i915_gem_madvise __user *user = (typeof(user))data;
+	struct drm_i915_gem_madvise arg;
 	struct drm_i915_gem_object *obj;
 	int err;
 
-	switch (args->madv) {
+	if (unlikely(!access_ok(VERIFY_WRITE, user, sizeof(*user))))
+		return -EFAULT;
+
+	user_access_begin();
+	unsafe_get_user(arg.handle, &user->handle, err_user);
+	unsafe_get_user(arg.madv, &user->madv, err_user);
+	user_access_end();
+
+	switch (arg.madv) {
 	case I915_MADV_DONTNEED:
 	case I915_MADV_WILLNEED:
 	    break;
@@ -4326,8 +4335,8 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
 	    return -EINVAL;
 	}
 
-	obj = i915_gem_object_lookup(file_priv, args->handle);
-	if (!obj)
+	obj = i915_gem_object_lookup(filp->private_data, arg.handle);
+	if (unlikely(!obj))
 		return -ENOENT;
 
 	err = mutex_lock_interruptible(&obj->mm.lock);
@@ -4336,13 +4345,13 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
 
 	if (obj->mm.pages &&
 	    i915_gem_object_is_tiled(obj) &&
-	    dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
+	    to_i915(obj->base.dev)->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
 		if (obj->mm.madv == I915_MADV_WILLNEED) {
 			GEM_BUG_ON(!obj->mm.quirked);
 			__i915_gem_object_unpin_pages(obj);
 			obj->mm.quirked = false;
 		}
-		if (args->madv == I915_MADV_WILLNEED) {
+		if (arg.madv == I915_MADV_WILLNEED) {
 			GEM_BUG_ON(obj->mm.quirked);
 			__i915_gem_object_pin_pages(obj);
 			obj->mm.quirked = true;
@@ -4350,18 +4359,26 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
 	}
 
 	if (obj->mm.madv != __I915_MADV_PURGED)
-		obj->mm.madv = args->madv;
+		obj->mm.madv = arg.madv;
 
 	/* if the object is no longer attached, discard its backing storage */
 	if (obj->mm.madv == I915_MADV_DONTNEED && !obj->mm.pages)
 		i915_gem_object_truncate(obj);
 
-	args->retained = obj->mm.madv != __I915_MADV_PURGED;
+	arg.retained = obj->mm.madv != __I915_MADV_PURGED;
 	mutex_unlock(&obj->mm.lock);
 
+	user_access_begin();
+	unsafe_put_user(arg.retained, &user->retained, err_user);
+	user_access_end();
+
 out:
 	i915_gem_object_put(obj);
 	return err;
+
+err_user:
+	user_access_end();
+	return -EFAULT;
 }
 
 static void
-- 
2.11.0



More information about the Intel-gfx-trybot mailing list