Skip to content

Commit 3a8557e

Browse files
committed
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()
2 parents 4382a79 + 7b3f0c4 commit 3a8557e

File tree

5 files changed

+28
-58
lines changed

5 files changed

+28
-58
lines changed

drivers/gpu/drm/i915/gem/i915_gem_context.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,11 +1921,6 @@ get_engines(struct i915_gem_context *ctx,
19211921
}
19221922

19231923
user = u64_to_user_ptr(args->value);
1924-
if (!access_ok(user, size)) {
1925-
err = -EFAULT;
1926-
goto err_free;
1927-
}
1928-
19291924
if (put_user(0, &user->extensions)) {
19301925
err = -EFAULT;
19311926
goto err_free;

drivers/gpu/drm/i915/i915_ioc32.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,16 @@ static int compat_i915_getparam(struct file *file, unsigned int cmd,
4747
unsigned long arg)
4848
{
4949
struct drm_i915_getparam32 req32;
50-
drm_i915_getparam_t __user *request;
50+
struct drm_i915_getparam req;
5151

5252
if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
5353
return -EFAULT;
5454

55-
request = compat_alloc_user_space(sizeof(*request));
56-
if (!access_ok(request, sizeof(*request)) ||
57-
__put_user(req32.param, &request->param) ||
58-
__put_user((void __user *)(unsigned long)req32.value,
59-
&request->value))
60-
return -EFAULT;
55+
req.param = req32.param;
56+
req.value = compat_ptr(req32.value);
6157

62-
return drm_ioctl(file, DRM_IOCTL_I915_GETPARAM,
63-
(unsigned long)request);
58+
return drm_ioctl_kernel(file, i915_getparam_ioctl, &req,
59+
DRM_RENDER_ALLOW);
6460
}
6561

6662
static drm_ioctl_compat_t *i915_compat_ioctls[] = {

drivers/gpu/drm/i915/i915_perf.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3896,9 +3896,6 @@ static struct i915_oa_reg *alloc_oa_regs(struct i915_perf *perf,
38963896
if (!n_regs)
38973897
return NULL;
38983898

3899-
if (!access_ok(regs, n_regs * sizeof(u32) * 2))
3900-
return ERR_PTR(-EFAULT);
3901-
39023899
/* No is_valid function means we're not allowing any register to be programmed. */
39033900
GEM_BUG_ON(!is_valid);
39043901
if (!is_valid)

drivers/gpu/drm/i915/i915_query.c

Lines changed: 22 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@ static int copy_query_item(void *query_hdr, size_t query_sz,
2525
query_sz))
2626
return -EFAULT;
2727

28-
if (!access_ok(u64_to_user_ptr(query_item->data_ptr),
29-
total_length))
30-
return -EFAULT;
31-
3228
return 0;
3329
}
3430

@@ -72,20 +68,20 @@ static int query_topology_info(struct drm_i915_private *dev_priv,
7268
topo.eu_offset = slice_length + subslice_length;
7369
topo.eu_stride = sseu->eu_stride;
7470

75-
if (__copy_to_user(u64_to_user_ptr(query_item->data_ptr),
71+
if (copy_to_user(u64_to_user_ptr(query_item->data_ptr),
7672
&topo, sizeof(topo)))
7773
return -EFAULT;
7874

79-
if (__copy_to_user(u64_to_user_ptr(query_item->data_ptr + sizeof(topo)),
75+
if (copy_to_user(u64_to_user_ptr(query_item->data_ptr + sizeof(topo)),
8076
&sseu->slice_mask, slice_length))
8177
return -EFAULT;
8278

83-
if (__copy_to_user(u64_to_user_ptr(query_item->data_ptr +
79+
if (copy_to_user(u64_to_user_ptr(query_item->data_ptr +
8480
sizeof(topo) + slice_length),
8581
sseu->subslice_mask, subslice_length))
8682
return -EFAULT;
8783

88-
if (__copy_to_user(u64_to_user_ptr(query_item->data_ptr +
84+
if (copy_to_user(u64_to_user_ptr(query_item->data_ptr +
8985
sizeof(topo) +
9086
slice_length + subslice_length),
9187
sseu->eu_mask, eu_length))
@@ -131,14 +127,14 @@ query_engine_info(struct drm_i915_private *i915,
131127
info.engine.engine_instance = engine->uabi_instance;
132128
info.capabilities = engine->uabi_capabilities;
133129

134-
if (__copy_to_user(info_ptr, &info, sizeof(info)))
130+
if (copy_to_user(info_ptr, &info, sizeof(info)))
135131
return -EFAULT;
136132

137133
query.num_engines++;
138134
info_ptr++;
139135
}
140136

141-
if (__copy_to_user(query_ptr, &query, sizeof(query)))
137+
if (copy_to_user(query_ptr, &query, sizeof(query)))
142138
return -EFAULT;
143139

144140
return len;
@@ -158,10 +154,6 @@ static int can_copy_perf_config_registers_or_number(u32 user_n_regs,
158154
if (user_n_regs < kernel_n_regs)
159155
return -EINVAL;
160156

161-
if (!access_ok(u64_to_user_ptr(user_regs_ptr),
162-
2 * sizeof(u32) * kernel_n_regs))
163-
return -EFAULT;
164-
165157
return 0;
166158
}
167159

@@ -170,6 +162,7 @@ static int copy_perf_config_registers_or_number(const struct i915_oa_reg *kernel
170162
u64 user_regs_ptr,
171163
u32 *user_n_regs)
172164
{
165+
u32 __user *p = u64_to_user_ptr(user_regs_ptr);
173166
u32 r;
174167

175168
if (*user_n_regs == 0) {
@@ -179,25 +172,19 @@ static int copy_perf_config_registers_or_number(const struct i915_oa_reg *kernel
179172

180173
*user_n_regs = kernel_n_regs;
181174

182-
for (r = 0; r < kernel_n_regs; r++) {
183-
u32 __user *user_reg_ptr =
184-
u64_to_user_ptr(user_regs_ptr + sizeof(u32) * r * 2);
185-
u32 __user *user_val_ptr =
186-
u64_to_user_ptr(user_regs_ptr + sizeof(u32) * r * 2 +
187-
sizeof(u32));
188-
int ret;
189-
190-
ret = __put_user(i915_mmio_reg_offset(kernel_regs[r].addr),
191-
user_reg_ptr);
192-
if (ret)
193-
return -EFAULT;
175+
if (!user_write_access_begin(p, 2 * sizeof(u32) * kernel_n_regs))
176+
return -EFAULT;
194177

195-
ret = __put_user(kernel_regs[r].value, user_val_ptr);
196-
if (ret)
197-
return -EFAULT;
178+
for (r = 0; r < kernel_n_regs; r++, p += 2) {
179+
unsafe_put_user(i915_mmio_reg_offset(kernel_regs[r].addr),
180+
p, Efault);
181+
unsafe_put_user(kernel_regs[r].value, p + 1, Efault);
198182
}
199-
183+
user_write_access_end();
200184
return 0;
185+
Efault:
186+
user_write_access_end();
187+
return -EFAULT;
201188
}
202189

203190
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,
233220
return -EINVAL;
234221
}
235222

236-
if (!access_ok(user_query_config_ptr, total_size))
237-
return -EFAULT;
238-
239-
if (__get_user(flags, &user_query_config_ptr->flags))
223+
if (get_user(flags, &user_query_config_ptr->flags))
240224
return -EFAULT;
241225

242226
if (flags != 0)
@@ -249,7 +233,7 @@ static int query_perf_config_data(struct drm_i915_private *i915,
249233
BUILD_BUG_ON(sizeof(user_query_config_ptr->uuid) >= sizeof(uuid));
250234

251235
memset(&uuid, 0, sizeof(uuid));
252-
if (__copy_from_user(uuid, user_query_config_ptr->uuid,
236+
if (copy_from_user(uuid, user_query_config_ptr->uuid,
253237
sizeof(user_query_config_ptr->uuid)))
254238
return -EFAULT;
255239

@@ -263,16 +247,15 @@ static int query_perf_config_data(struct drm_i915_private *i915,
263247
}
264248
rcu_read_unlock();
265249
} else {
266-
if (__get_user(config_id, &user_query_config_ptr->config))
250+
if (get_user(config_id, &user_query_config_ptr->config))
267251
return -EFAULT;
268252

269253
oa_config = i915_perf_get_oa_config(perf, config_id);
270254
}
271255
if (!oa_config)
272256
return -ENOENT;
273257

274-
if (__copy_from_user(&user_config, user_config_ptr,
275-
sizeof(user_config))) {
258+
if (copy_from_user(&user_config, user_config_ptr, sizeof(user_config))) {
276259
ret = -EFAULT;
277260
goto out;
278261
}
@@ -318,8 +301,7 @@ static int query_perf_config_data(struct drm_i915_private *i915,
318301

319302
memcpy(user_config.uuid, oa_config->uuid, sizeof(user_config.uuid));
320303

321-
if (__copy_to_user(user_config_ptr, &user_config,
322-
sizeof(user_config))) {
304+
if (copy_to_user(user_config_ptr, &user_config, sizeof(user_config))) {
323305
ret = -EFAULT;
324306
goto out;
325307
}

drivers/gpu/drm/i915/i915_reg.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ typedef struct {
186186

187187
#define INVALID_MMIO_REG _MMIO(0)
188188

189-
static inline u32 i915_mmio_reg_offset(i915_reg_t reg)
189+
static __always_inline u32 i915_mmio_reg_offset(i915_reg_t reg)
190190
{
191191
return reg.reg;
192192
}

0 commit comments

Comments
 (0)