Commit 3a8557e1 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'uaccess.i915' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull i915 uaccess updates from Al Viro:
 "Low-hanging fruit in i915; there are several trickier followups, but
  that'll wait for the next cycle"

* 'uaccess.i915' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  i915:get_engines(): get rid of pointless access_ok()
  i915: alloc_oa_regs(): get rid of pointless access_ok()
  i915 compat ioctl(): just use drm_ioctl_kernel()
  i915: switch copy_perf_config_registers_or_number() to unsafe_put_user()
  i915: switch query_{topology,engine}_info() to copy_to_user()
parents 4382a79b 7b3f0c4c
...@@ -1921,11 +1921,6 @@ get_engines(struct i915_gem_context *ctx, ...@@ -1921,11 +1921,6 @@ get_engines(struct i915_gem_context *ctx,
} }
user = u64_to_user_ptr(args->value); user = u64_to_user_ptr(args->value);
if (!access_ok(user, size)) {
err = -EFAULT;
goto err_free;
}
if (put_user(0, &user->extensions)) { if (put_user(0, &user->extensions)) {
err = -EFAULT; err = -EFAULT;
goto err_free; goto err_free;
......
...@@ -47,20 +47,16 @@ static int compat_i915_getparam(struct file *file, unsigned int cmd, ...@@ -47,20 +47,16 @@ static int compat_i915_getparam(struct file *file, unsigned int cmd,
unsigned long arg) unsigned long arg)
{ {
struct drm_i915_getparam32 req32; struct drm_i915_getparam32 req32;
drm_i915_getparam_t __user *request; struct drm_i915_getparam req;
if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
return -EFAULT; return -EFAULT;
request = compat_alloc_user_space(sizeof(*request)); req.param = req32.param;
if (!access_ok(request, sizeof(*request)) || req.value = compat_ptr(req32.value);
__put_user(req32.param, &request->param) ||
__put_user((void __user *)(unsigned long)req32.value,
&request->value))
return -EFAULT;
return drm_ioctl(file, DRM_IOCTL_I915_GETPARAM, return drm_ioctl_kernel(file, i915_getparam_ioctl, &req,
(unsigned long)request); DRM_RENDER_ALLOW);
} }
static drm_ioctl_compat_t *i915_compat_ioctls[] = { static drm_ioctl_compat_t *i915_compat_ioctls[] = {
......
...@@ -3896,9 +3896,6 @@ static struct i915_oa_reg *alloc_oa_regs(struct i915_perf *perf, ...@@ -3896,9 +3896,6 @@ static struct i915_oa_reg *alloc_oa_regs(struct i915_perf *perf,
if (!n_regs) if (!n_regs)
return NULL; return NULL;
if (!access_ok(regs, n_regs * sizeof(u32) * 2))
return ERR_PTR(-EFAULT);
/* No is_valid function means we're not allowing any register to be programmed. */ /* No is_valid function means we're not allowing any register to be programmed. */
GEM_BUG_ON(!is_valid); GEM_BUG_ON(!is_valid);
if (!is_valid) if (!is_valid)
......
...@@ -25,10 +25,6 @@ static int copy_query_item(void *query_hdr, size_t query_sz, ...@@ -25,10 +25,6 @@ static int copy_query_item(void *query_hdr, size_t query_sz,
query_sz)) query_sz))
return -EFAULT; return -EFAULT;
if (!access_ok(u64_to_user_ptr(query_item->data_ptr),
total_length))
return -EFAULT;
return 0; return 0;
} }
...@@ -72,20 +68,20 @@ static int query_topology_info(struct drm_i915_private *dev_priv, ...@@ -72,20 +68,20 @@ static int query_topology_info(struct drm_i915_private *dev_priv,
topo.eu_offset = slice_length + subslice_length; topo.eu_offset = slice_length + subslice_length;
topo.eu_stride = sseu->eu_stride; topo.eu_stride = sseu->eu_stride;
if (__copy_to_user(u64_to_user_ptr(query_item->data_ptr), if (copy_to_user(u64_to_user_ptr(query_item->data_ptr),
&topo, sizeof(topo))) &topo, sizeof(topo)))
return -EFAULT; return -EFAULT;
if (__copy_to_user(u64_to_user_ptr(query_item->data_ptr + sizeof(topo)), if (copy_to_user(u64_to_user_ptr(query_item->data_ptr + sizeof(topo)),
&sseu->slice_mask, slice_length)) &sseu->slice_mask, slice_length))
return -EFAULT; return -EFAULT;
if (__copy_to_user(u64_to_user_ptr(query_item->data_ptr + if (copy_to_user(u64_to_user_ptr(query_item->data_ptr +
sizeof(topo) + slice_length), sizeof(topo) + slice_length),
sseu->subslice_mask, subslice_length)) sseu->subslice_mask, subslice_length))
return -EFAULT; return -EFAULT;
if (__copy_to_user(u64_to_user_ptr(query_item->data_ptr + if (copy_to_user(u64_to_user_ptr(query_item->data_ptr +
sizeof(topo) + sizeof(topo) +
slice_length + subslice_length), slice_length + subslice_length),
sseu->eu_mask, eu_length)) sseu->eu_mask, eu_length))
...@@ -131,14 +127,14 @@ query_engine_info(struct drm_i915_private *i915, ...@@ -131,14 +127,14 @@ query_engine_info(struct drm_i915_private *i915,
info.engine.engine_instance = engine->uabi_instance; info.engine.engine_instance = engine->uabi_instance;
info.capabilities = engine->uabi_capabilities; info.capabilities = engine->uabi_capabilities;
if (__copy_to_user(info_ptr, &info, sizeof(info))) if (copy_to_user(info_ptr, &info, sizeof(info)))
return -EFAULT; return -EFAULT;
query.num_engines++; query.num_engines++;
info_ptr++; info_ptr++;
} }
if (__copy_to_user(query_ptr, &query, sizeof(query))) if (copy_to_user(query_ptr, &query, sizeof(query)))
return -EFAULT; return -EFAULT;
return len; return len;
...@@ -158,10 +154,6 @@ static int can_copy_perf_config_registers_or_number(u32 user_n_regs, ...@@ -158,10 +154,6 @@ static int can_copy_perf_config_registers_or_number(u32 user_n_regs,
if (user_n_regs < kernel_n_regs) if (user_n_regs < kernel_n_regs)
return -EINVAL; return -EINVAL;
if (!access_ok(u64_to_user_ptr(user_regs_ptr),
2 * sizeof(u32) * kernel_n_regs))
return -EFAULT;
return 0; return 0;
} }
...@@ -170,6 +162,7 @@ static int copy_perf_config_registers_or_number(const struct i915_oa_reg *kernel ...@@ -170,6 +162,7 @@ static int copy_perf_config_registers_or_number(const struct i915_oa_reg *kernel
u64 user_regs_ptr, u64 user_regs_ptr,
u32 *user_n_regs) u32 *user_n_regs)
{ {
u32 __user *p = u64_to_user_ptr(user_regs_ptr);
u32 r; u32 r;
if (*user_n_regs == 0) { if (*user_n_regs == 0) {
...@@ -179,25 +172,19 @@ static int copy_perf_config_registers_or_number(const struct i915_oa_reg *kernel ...@@ -179,25 +172,19 @@ static int copy_perf_config_registers_or_number(const struct i915_oa_reg *kernel
*user_n_regs = kernel_n_regs; *user_n_regs = kernel_n_regs;
for (r = 0; r < kernel_n_regs; r++) { if (!user_write_access_begin(p, 2 * sizeof(u32) * kernel_n_regs))
u32 __user *user_reg_ptr =
u64_to_user_ptr(user_regs_ptr + sizeof(u32) * r * 2);
u32 __user *user_val_ptr =
u64_to_user_ptr(user_regs_ptr + sizeof(u32) * r * 2 +
sizeof(u32));
int ret;
ret = __put_user(i915_mmio_reg_offset(kernel_regs[r].addr),
user_reg_ptr);
if (ret)
return -EFAULT; return -EFAULT;
ret = __put_user(kernel_regs[r].value, user_val_ptr); for (r = 0; r < kernel_n_regs; r++, p += 2) {
if (ret) unsafe_put_user(i915_mmio_reg_offset(kernel_regs[r].addr),
return -EFAULT; p, Efault);
unsafe_put_user(kernel_regs[r].value, p + 1, Efault);
} }
user_write_access_end();
return 0; return 0;
Efault:
user_write_access_end();
return -EFAULT;
} }
static int query_perf_config_data(struct drm_i915_private *i915, static int query_perf_config_data(struct drm_i915_private *i915,
...@@ -233,10 +220,7 @@ static int query_perf_config_data(struct drm_i915_private *i915, ...@@ -233,10 +220,7 @@ static int query_perf_config_data(struct drm_i915_private *i915,
return -EINVAL; return -EINVAL;
} }
if (!access_ok(user_query_config_ptr, total_size)) if (get_user(flags, &user_query_config_ptr->flags))
return -EFAULT;
if (__get_user(flags, &user_query_config_ptr->flags))
return -EFAULT; return -EFAULT;
if (flags != 0) if (flags != 0)
...@@ -249,7 +233,7 @@ static int query_perf_config_data(struct drm_i915_private *i915, ...@@ -249,7 +233,7 @@ static int query_perf_config_data(struct drm_i915_private *i915,
BUILD_BUG_ON(sizeof(user_query_config_ptr->uuid) >= sizeof(uuid)); BUILD_BUG_ON(sizeof(user_query_config_ptr->uuid) >= sizeof(uuid));
memset(&uuid, 0, sizeof(uuid)); memset(&uuid, 0, sizeof(uuid));
if (__copy_from_user(uuid, user_query_config_ptr->uuid, if (copy_from_user(uuid, user_query_config_ptr->uuid,
sizeof(user_query_config_ptr->uuid))) sizeof(user_query_config_ptr->uuid)))
return -EFAULT; return -EFAULT;
...@@ -263,7 +247,7 @@ static int query_perf_config_data(struct drm_i915_private *i915, ...@@ -263,7 +247,7 @@ static int query_perf_config_data(struct drm_i915_private *i915,
} }
rcu_read_unlock(); rcu_read_unlock();
} else { } else {
if (__get_user(config_id, &user_query_config_ptr->config)) if (get_user(config_id, &user_query_config_ptr->config))
return -EFAULT; return -EFAULT;
oa_config = i915_perf_get_oa_config(perf, config_id); oa_config = i915_perf_get_oa_config(perf, config_id);
...@@ -271,8 +255,7 @@ static int query_perf_config_data(struct drm_i915_private *i915, ...@@ -271,8 +255,7 @@ static int query_perf_config_data(struct drm_i915_private *i915,
if (!oa_config) if (!oa_config)
return -ENOENT; return -ENOENT;
if (__copy_from_user(&user_config, user_config_ptr, if (copy_from_user(&user_config, user_config_ptr, sizeof(user_config))) {
sizeof(user_config))) {
ret = -EFAULT; ret = -EFAULT;
goto out; goto out;
} }
...@@ -318,8 +301,7 @@ static int query_perf_config_data(struct drm_i915_private *i915, ...@@ -318,8 +301,7 @@ static int query_perf_config_data(struct drm_i915_private *i915,
memcpy(user_config.uuid, oa_config->uuid, sizeof(user_config.uuid)); memcpy(user_config.uuid, oa_config->uuid, sizeof(user_config.uuid));
if (__copy_to_user(user_config_ptr, &user_config, if (copy_to_user(user_config_ptr, &user_config, sizeof(user_config))) {
sizeof(user_config))) {
ret = -EFAULT; ret = -EFAULT;
goto out; goto out;
} }
......
...@@ -186,7 +186,7 @@ typedef struct { ...@@ -186,7 +186,7 @@ typedef struct {
#define INVALID_MMIO_REG _MMIO(0) #define INVALID_MMIO_REG _MMIO(0)
static inline u32 i915_mmio_reg_offset(i915_reg_t reg) static __always_inline u32 i915_mmio_reg_offset(i915_reg_t reg)
{ {
return reg.reg; return reg.reg;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment