[PATCH 62/74] fast-context-get-stats
Chris Wilson
chris at chris-wilson.co.uk
Thu Sep 14 17:34:36 UTC 2017
---
drivers/gpu/drm/i915/i915_drv.c | 2 +-
drivers/gpu/drm/i915/i915_gem_context.c | 60 ++++++++++++++++++++++-----------
drivers/gpu/drm/i915/i915_gem_context.h | 5 +--
3 files changed, 45 insertions(+), 22 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 04eaa7891116..ce141813ea6e 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -2679,7 +2679,7 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_CREATE, i915_gem_context_create_ioctl, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_DESTROY, i915_gem_context_destroy_ioctl, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(I915_REG_READ, i915_reg_read_ioctl, DRM_RENDER_ALLOW),
- DRM_IOCTL_DEF_DRV(I915_GET_RESET_STATS, i915_gem_context_reset_stats_ioctl, DRM_RENDER_ALLOW),
+ DRM_DRIVER_IOCTL_DEF(I915_GET_RESET_STATS, i915_gem_context_reset_stats_ioctl, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_GETPARAM, i915_gem_context_getparam_ioctl, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_SETPARAM, i915_gem_context_setparam_ioctl, DRM_RENDER_ALLOW),
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 488719e6766c..f97c492c3a10 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -1178,22 +1178,32 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
return ret;
}
-int i915_gem_context_reset_stats_ioctl(struct drm_device *dev,
- void *data, struct drm_file *file)
+long i915_gem_context_reset_stats_ioctl(struct file *filp,
+ unsigned int cmd,
+ unsigned long data)
{
- struct drm_i915_private *dev_priv = to_i915(dev);
- struct drm_i915_reset_stats *args = data;
+ struct drm_i915_reset_stats __user *user = (typeof(user))data;
+ struct drm_file *file = filp->private_data;
+ struct drm_i915_reset_stats stats;
struct i915_gem_context *ctx;
- int ret;
- if (args->flags || args->pad)
- return -EINVAL;
+ if (unlikely(!access_ok(VERIFY_WRITE, user, sizeof(*user))))
+ return -EFAULT;
+
+ user_access_begin();
+ unsafe_get_user(stats.flags, &user->flags, err_user);
+ unsafe_get_user(stats.pad, &user->pad, err_user);
+ unsafe_get_user(stats.ctx_id, &user->ctx_id, err_user);
+ user_access_end();
+
+ if (unlikely(stats.flags | stats.pad))
+ goto err_invalid;
- ret = -ENOENT;
rcu_read_lock();
- ctx = __i915_gem_context_lookup_rcu(file->driver_priv, args->ctx_id);
- if (!ctx)
- goto out;
+
+ ctx = __i915_gem_context_lookup_rcu(file->driver_priv, stats.ctx_id);
+ if (unlikely(!ctx))
+ goto err_ctx;
/*
* We opt for unserialised reads here. This may result in tearing
@@ -1202,18 +1212,30 @@ int i915_gem_context_reset_stats_ioctl(struct drm_device *dev,
* we should wrap the hangstats with a seqlock.
*/
+ stats.reset_count = 0;
if (capable(CAP_SYS_ADMIN))
- args->reset_count = i915_reset_count(&dev_priv->gpu_error);
- else
- args->reset_count = 0;
+ stats.reset_count = i915_reset_count(&ctx->i915->gpu_error);
+ stats.batch_active = atomic_read(&ctx->guilty_count);
+ stats.batch_pending = atomic_read(&ctx->active_count);
- args->batch_active = atomic_read(&ctx->guilty_count);
- args->batch_pending = atomic_read(&ctx->active_count);
+ rcu_read_unlock();
- ret = 0;
-out:
+ user_access_begin();
+ unsafe_put_user(stats.reset_count, &user->reset_count, err_user);
+ unsafe_put_user(stats.batch_active, &user->batch_active, err_user);
+ unsafe_put_user(stats.batch_pending, &user->batch_pending, err_user);
+ user_access_end();
+ return 0;
+
+err_ctx:
rcu_read_unlock();
- return ret;
+ return -ENOENT;
+err_user:
+ user_access_end();
+ return -EFAULT;
+err_invalid:
+ user_access_end();
+ return -EINVAL;
}
#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
diff --git a/drivers/gpu/drm/i915/i915_gem_context.h b/drivers/gpu/drm/i915/i915_gem_context.h
index baa111749c85..5dd2e7864d9d 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.h
+++ b/drivers/gpu/drm/i915/i915_gem_context.h
@@ -294,8 +294,9 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
-int i915_gem_context_reset_stats_ioctl(struct drm_device *dev, void *data,
- struct drm_file *file);
+long i915_gem_context_reset_stats_ioctl(struct file *filp,
+ unsigned int cmd,
+ unsigned long arg);
static inline struct i915_gem_context *
i915_gem_context_get(struct i915_gem_context *ctx)
--
2.14.1
More information about the Intel-gfx-trybot
mailing list