[PATCH 42/43] fast-create-ioctl
Chris Wilson
chris at chris-wilson.co.uk
Fri Jun 2 18:10:23 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 66f635b3a029..2eca94c288bc 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -2546,7 +2546,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 3dee207d7522..7d94742c6d2d 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3181,8 +3181,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 7f483a15f3d1..258f9544b822 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -703,17 +703,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.11.0
More information about the Intel-gfx-trybot
mailing list