[PATCH 57/74] fast-create-ioctl

Chris Wilson chris at chris-wilson.co.uk
Sun Jul 16 19:00:58 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 | 40 ++++++++++++++++++++++++++++++++--------
 3 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 93337494f1b7..f55fe63d400e 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -2650,7 +2650,7 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
 	DRM_DRIVER_IOCTL_DEF(I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_GEM_ENTERVT, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 	DRM_IOCTL_DEF_DRV(I915_GEM_LEAVEVT, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-	DRM_IOCTL_DEF_DRV(I915_GEM_CREATE, i915_gem_create_ioctl, DRM_RENDER_ALLOW),
+	DRM_DRIVER_IOCTL_DEF(I915_GEM_CREATE, i915_gem_create_ioctl, DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_GEM_PREAD, i915_gem_pread_ioctl, DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_GEM_PWRITE, i915_gem_pwrite_ioctl, DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(I915_GEM_MMAP, i915_gem_mmap_ioctl, DRM_RENDER_ALLOW),
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f571d32fc839..57d306ed5de5 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3239,8 +3239,9 @@ ibx_disable_display_interrupt(struct drm_i915_private *dev_priv, uint32_t bits)
 }
 
 /* i915_gem.c */
-int i915_gem_create_ioctl(struct drm_device *dev, void *data,
-			  struct drm_file *file_priv);
+long i915_gem_create_ioctl(struct file *filp,
+			   unsigned int cmd,
+			   unsigned long data);
 int i915_gem_pread_ioctl(struct drm_device *dev, void *data,
 			 struct drm_file *file_priv);
 int i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index f07534db17a4..c0e8d333dafe 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -687,17 +687,41 @@ static bool gpu_write_needs_clflush(struct drm_i915_gem_object *obj)
  * @data: ioctl data blob
  * @file: drm file pointer
  */
-int
-i915_gem_create_ioctl(struct drm_device *dev, void *data,
-		      struct drm_file *file)
+long
+i915_gem_create_ioctl(struct file *filp,
+		      unsigned int cmd,
+		      unsigned long data)
 {
-	struct drm_i915_private *dev_priv = to_i915(dev);
-	struct drm_i915_gem_create *args = data;
+	struct drm_i915_gem_create __user *user = (typeof(user))data;
+	struct drm_file *drm_file = filp->private_data;
+	struct drm_i915_file_private *file = drm_file->driver_priv;
+	u64 size;
+	u32 handle;
+	int err;
 
-	i915_gem_flush_free_objects(dev_priv);
+	if (unlikely(!access_ok(VERIFY_WRITE, user, sizeof(*user))))
+		return -EFAULT;
+
+	user_access_begin();
+	unsafe_get_user(size, &user->size, err_user);
+	user_access_end();
+
+	i915_gem_flush_free_objects(file->dev_priv);
+
+	err = i915_gem_create(drm_file, file->dev_priv, size, &handle);
+	if (unlikely(err))
+		return err;
+
+	user_access_begin();
+	unsafe_put_user(handle, &user->handle, err_user);
+	user_access_end();
+
+	return 0;
+
+err_user:
+	user_access_end();
+	return -EFAULT;
 
-	return i915_gem_create(file, dev_priv,
-			       args->size, &args->handle);
 }
 
 static inline enum fb_op_origin
-- 
2.13.2



More information about the Intel-gfx-trybot mailing list