tree:
https://git.kernel.org/pub/scm/linux/kernel/git/rw/uml.git linux-next
head: 1aee020155f364ef538370d3392969f1077b9bae
commit: dd3035a21ba7ccaa883d7107d357ad06320d78fc [13/19] um: add a UML specific futex
implementation
config: um-x86_64_defconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.3-341-g8af24329-dirty
#
https://git.kernel.org/pub/scm/linux/kernel/git/rw/uml.git/commit/?id=dd3...
git remote add uml
https://git.kernel.org/pub/scm/linux/kernel/git/rw/uml.git
git fetch --no-tags uml linux-next
git checkout dd3035a21ba7ccaa883d7107d357ad06320d78fc
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' W=1 ARCH=um
SUBARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
sparse warnings: (new ones prefixed by >>)
> arch/um/kernel/skas/uaccess.c:292:15: sparse: sparse: incorrect
type in assignment (different address spaces) @@ expected unsigned int [noderef]
[usertype] __user *uaddr @@ got unsigned int [usertype] * @@
arch/um/kernel/skas/uaccess.c:292:15: sparse: expected unsigned int [noderef]
[usertype] __user *uaddr
arch/um/kernel/skas/uaccess.c:292:15: sparse: got unsigned int [usertype] *
> arch/um/kernel/skas/uaccess.c:366:15: sparse: sparse: incorrect
type in assignment (different address spaces) @@ expected unsigned int [noderef]
[usertype] __user *uaddr @@ got void * @@
arch/um/kernel/skas/uaccess.c:366:15: sparse: expected unsigned int [noderef]
[usertype] __user *uaddr
arch/um/kernel/skas/uaccess.c:366:15: sparse: got void *
> arch/um/kernel/skas/uaccess.c:373:15: sparse: sparse: incorrect
type in argument 1 (different address spaces) @@ expected void const volatile *v @@
got unsigned int [noderef] [usertype] __user *__ai_ptr @@
arch/um/kernel/skas/uaccess.c:373:15: sparse: expected void const volatile *v
arch/um/kernel/skas/uaccess.c:373:15: sparse: got unsigned int [noderef] [usertype]
__user *__ai_ptr
> arch/um/kernel/skas/uaccess.c:373:15: sparse: sparse: cast
removes address space '__user' of expression
> arch/um/kernel/skas/uaccess.c:373:15: sparse: sparse: cast removes address space
'__user' of expression
> arch/um/kernel/skas/uaccess.c:373:15: sparse: sparse: cast removes address space
'__user' of expression
> arch/um/kernel/skas/uaccess.c:373:15: sparse: sparse: cast removes address space
'__user' of expression
> arch/um/kernel/skas/uaccess.c:293:19: sparse: sparse: dereference of noderef
expression
arch/um/kernel/skas/uaccess.c:299:18: sparse: sparse: dereference of
noderef expression
arch/um/kernel/skas/uaccess.c:302:18: sparse: sparse: dereference of noderef
expression
arch/um/kernel/skas/uaccess.c:305:18: sparse: sparse: dereference of noderef
expression
arch/um/kernel/skas/uaccess.c:308:18: sparse: sparse: dereference of noderef
expression
arch/um/kernel/skas/uaccess.c:311:18: sparse: sparse: dereference of noderef
expression
arch/um/kernel/skas/uaccess.c:371:18: sparse: sparse: dereference of noderef
expression
vim +292 arch/um/kernel/skas/uaccess.c
252
253 /**
254 * arch_futex_atomic_op_inuser() - Atomic arithmetic operation with constant
255 * argument and comparison of the previous
256 * futex value with another constant.
257 *
258 * @encoded_op: encoded operation to execute
259 * @uaddr: pointer to user space address
260 *
261 * Return:
262 * 0 - On success
263 * -EFAULT - User access resulted in a page fault
264 * -EAGAIN - Atomic operation was unable to complete due to contention
265 * -ENOSYS - Operation not supported
266 */
267
268 int arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval, u32 __user *uaddr)
269 {
270 int oldval, ret;
271 struct page *page;
272 unsigned long addr = (unsigned long) uaddr;
273 pte_t *pte;
274
275 ret = -EFAULT;
276 if (!access_ok(uaddr, sizeof(*uaddr)))
277 return -EFAULT;
278 preempt_disable();
279 pte = maybe_map(addr, 1);
280 if (pte == NULL)
281 goto out_inuser;
282
283 page = pte_page(*pte);
284 #ifdef CONFIG_64BIT
285 pagefault_disable();
286 addr = (unsigned long) page_address(page) +
287 (((unsigned long) addr) & ~PAGE_MASK);
288 #else
289 addr = (unsigned long) kmap_atomic(page) +
290 ((unsigned long) addr & ~PAGE_MASK);
291 #endif
292 uaddr = (u32 *) addr;
293 oldval = *uaddr;
294
295 ret = 0;
296
297 switch (op) {
298 case FUTEX_OP_SET:
299 *uaddr = oparg;
300 break;
301 case FUTEX_OP_ADD:
302 *uaddr += oparg;
303 break;
304 case FUTEX_OP_OR:
305 *uaddr |= oparg;
306 break;
307 case FUTEX_OP_ANDN:
308 *uaddr &= ~oparg;
309 break;
310 case FUTEX_OP_XOR:
311 *uaddr ^= oparg;
312 break;
313 default:
314 ret = -ENOSYS;
315 }
316 #ifdef CONFIG_64BIT
317 pagefault_enable();
318 #else
319 kunmap_atomic((void *)addr);
320 #endif
321
322 out_inuser:
323 preempt_enable();
324
325 if (ret == 0)
326 *oval = oldval;
327
328 return ret;
329 }
330 EXPORT_SYMBOL(arch_futex_atomic_op_inuser);
331
332 /**
333 * futex_atomic_cmpxchg_inatomic() - Compare and exchange the content of the
334 * uaddr with newval if the current value is
335 * oldval.
336 * @uval: pointer to store content of @uaddr
337 * @uaddr: pointer to user space address
338 * @oldval: old value
339 * @newval: new value to store to @uaddr
340 *
341 * Return:
342 * 0 - On success
343 * -EFAULT - User access resulted in a page fault
344 * -EAGAIN - Atomic operation was unable to complete due to contention
345 * -ENOSYS - Function not implemented (only if !HAVE_FUTEX_CMPXCHG)
346 */
347
348 int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
349 u32 oldval, u32 newval)
350 {
351 struct page *page;
352 pte_t *pte;
353 int ret = -EFAULT;
354
355 if (!access_ok(uaddr, sizeof(*uaddr)))
356 return -EFAULT;
357
358 preempt_disable();
359 pte = maybe_map((unsigned long) uaddr, 1);
360 if (pte == NULL)
361 goto out_inatomic;
362
363 page = pte_page(*pte);
364 #ifdef CONFIG_64BIT
365 pagefault_disable();
366 uaddr = page_address(page) + (((unsigned long) uaddr) &
~PAGE_MASK);
367 #else
368 uaddr = kmap_atomic(page) + ((unsigned long) uaddr & ~PAGE_MASK);
369 #endif
370
371 *uval = *uaddr;
372
373 ret = cmpxchg(uaddr, oldval, newval);
374
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org