Hi Peter,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on tip/sched/core]
[also build test WARNING on bpf-next/master bpf/master linus/master v5.16-rc2]
[cannot apply to arm64/for-next/core arm-perf/for-next/perf tip/core/entry next-20211123]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url:
https://github.com/0day-ci/linux/commits/Peter-Collingbourne/kernel-intro...
base:
https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git
cb0e52b7748737b2cf6481fdd9b920ce7e1ebbdf
config: x86_64-randconfig-s021-20211123
(
https://download.01.org/0day-ci/archive/20211124/202111240417.oXKdhwgK-lk...)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.4-dirty
#
https://github.com/0day-ci/linux/commit/7cd6f102201f3ea35eea1b990f7543e89...
git remote add linux-review
https://github.com/0day-ci/linux
git fetch --no-tags linux-review
Peter-Collingbourne/kernel-introduce-uaccess-logging/20211123-131922
git checkout 7cd6f102201f3ea35eea1b990f7543e890b7fdbb
# save the config file to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir
ARCH=x86_64 SHELL=/bin/bash
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 >>)
> kernel/uaccess-buffer.c:32:29: sparse: sparse: Using plain
integer as NULL pointer
> kernel/uaccess-buffer.c:72:31: sparse: sparse: incorrect type in argument 1
(different address spaces) @@ expected struct spinlock [usertype] *lock @@ got
struct spinlock [noderef] __rcu * @@
kernel/uaccess-buffer.c:72:31: sparse:
expected struct spinlock [usertype] *lock
kernel/uaccess-buffer.c:72:31: sparse: got struct spinlock [noderef] __rcu *
kernel/uaccess-buffer.c:75:33: sparse: sparse: incorrect type in argument 1 (different
address spaces) @@ expected struct spinlock [usertype] *lock @@ got struct
spinlock [noderef] __rcu * @@
kernel/uaccess-buffer.c:75:33: sparse: expected struct spinlock [usertype] *lock
kernel/uaccess-buffer.c:75:33: sparse: got struct spinlock [noderef] __rcu *
kernel/uaccess-buffer.c:83:29: sparse: sparse: Using plain integer as NULL pointer
kernel/uaccess-buffer.c:94:13: sparse: sparse: Using plain integer as NULL pointer
> kernel/uaccess-buffer.c:117:22: sparse: sparse: cast removes
address space '__user' of expression
kernel/uaccess-buffer.c:119:21:
sparse: sparse: Using plain integer as NULL pointer
vim +32 kernel/uaccess-buffer.c
e050ed271bb0008 Peter Collingbourne 2021-11-22 17
e050ed271bb0008 Peter Collingbourne 2021-11-22 18 static void
uaccess_buffer_log(unsigned long addr, unsigned long size,
e050ed271bb0008 Peter Collingbourne 2021-11-22 19 unsigned long flags)
e050ed271bb0008 Peter Collingbourne 2021-11-22 20 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 21 struct uaccess_buffer_info *buf =
¤t->uaccess_buffer;
e050ed271bb0008 Peter Collingbourne 2021-11-22 22 struct uaccess_buffer_entry *entry =
buf->kcur;
e050ed271bb0008 Peter Collingbourne 2021-11-22 23
e050ed271bb0008 Peter Collingbourne 2021-11-22 24 if (!entry ||
unlikely(uaccess_kernel()))
e050ed271bb0008 Peter Collingbourne 2021-11-22 25 return;
e050ed271bb0008 Peter Collingbourne 2021-11-22 26 entry->addr = addr;
e050ed271bb0008 Peter Collingbourne 2021-11-22 27 entry->size = size;
e050ed271bb0008 Peter Collingbourne 2021-11-22 28 entry->flags = flags;
e050ed271bb0008 Peter Collingbourne 2021-11-22 29
e050ed271bb0008 Peter Collingbourne 2021-11-22 30 ++buf->kcur;
e050ed271bb0008 Peter Collingbourne 2021-11-22 31 if (buf->kcur == buf->kend)
e050ed271bb0008 Peter Collingbourne 2021-11-22 @32 buf->kcur = 0;
e050ed271bb0008 Peter Collingbourne 2021-11-22 33 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 34
e050ed271bb0008 Peter Collingbourne 2021-11-22 35 void uaccess_buffer_log_read(const
void __user *from, unsigned long n)
e050ed271bb0008 Peter Collingbourne 2021-11-22 36 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 37 uaccess_buffer_log((unsigned
long)from, n, 0);
e050ed271bb0008 Peter Collingbourne 2021-11-22 38 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 39
EXPORT_SYMBOL(uaccess_buffer_log_read);
e050ed271bb0008 Peter Collingbourne 2021-11-22 40
e050ed271bb0008 Peter Collingbourne 2021-11-22 41 void uaccess_buffer_log_write(void
__user *to, unsigned long n)
e050ed271bb0008 Peter Collingbourne 2021-11-22 42 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 43 uaccess_buffer_log((unsigned
long)to, n, UACCESS_BUFFER_FLAG_WRITE);
e050ed271bb0008 Peter Collingbourne 2021-11-22 44 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 45
EXPORT_SYMBOL(uaccess_buffer_log_write);
e050ed271bb0008 Peter Collingbourne 2021-11-22 46
e050ed271bb0008 Peter Collingbourne 2021-11-22 47 int
uaccess_buffer_set_descriptor_addr_addr(unsigned long addr)
e050ed271bb0008 Peter Collingbourne 2021-11-22 48 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 49
current->uaccess_buffer.desc_ptr_ptr =
e050ed271bb0008 Peter Collingbourne 2021-11-22 50 (struct uaccess_descriptor __user *
__user *)addr;
e050ed271bb0008 Peter Collingbourne 2021-11-22 51 uaccess_buffer_cancel_log(current);
e050ed271bb0008 Peter Collingbourne 2021-11-22 52 return 0;
e050ed271bb0008 Peter Collingbourne 2021-11-22 53 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 54
e050ed271bb0008 Peter Collingbourne 2021-11-22 55 bool
__uaccess_buffer_pre_exit_loop(void)
e050ed271bb0008 Peter Collingbourne 2021-11-22 56 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 57 struct uaccess_buffer_info *buf =
¤t->uaccess_buffer;
e050ed271bb0008 Peter Collingbourne 2021-11-22 58 struct uaccess_descriptor __user
*desc_ptr;
e050ed271bb0008 Peter Collingbourne 2021-11-22 59 sigset_t tmp_mask;
e050ed271bb0008 Peter Collingbourne 2021-11-22 60
e050ed271bb0008 Peter Collingbourne 2021-11-22 61 if (get_user(desc_ptr,
buf->desc_ptr_ptr) || !desc_ptr)
e050ed271bb0008 Peter Collingbourne 2021-11-22 62 return false;
e050ed271bb0008 Peter Collingbourne 2021-11-22 63
e050ed271bb0008 Peter Collingbourne 2021-11-22 64 current->real_blocked =
current->blocked;
e050ed271bb0008 Peter Collingbourne 2021-11-22 65 sigfillset(&tmp_mask);
e050ed271bb0008 Peter Collingbourne 2021-11-22 66 set_current_blocked(&tmp_mask);
e050ed271bb0008 Peter Collingbourne 2021-11-22 67 return true;
e050ed271bb0008 Peter Collingbourne 2021-11-22 68 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 69
e050ed271bb0008 Peter Collingbourne 2021-11-22 70 void
__uaccess_buffer_post_exit_loop(void)
e050ed271bb0008 Peter Collingbourne 2021-11-22 71 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 @72
spin_lock_irq(¤t->sighand->siglock);
e050ed271bb0008 Peter Collingbourne 2021-11-22 73 current->blocked =
current->real_blocked;
e050ed271bb0008 Peter Collingbourne 2021-11-22 74 recalc_sigpending();
e050ed271bb0008 Peter Collingbourne 2021-11-22 75
spin_unlock_irq(¤t->sighand->siglock);
e050ed271bb0008 Peter Collingbourne 2021-11-22 76 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 77
e050ed271bb0008 Peter Collingbourne 2021-11-22 78 void uaccess_buffer_cancel_log(struct
task_struct *tsk)
e050ed271bb0008 Peter Collingbourne 2021-11-22 79 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 80 struct uaccess_buffer_info *buf =
&tsk->uaccess_buffer;
e050ed271bb0008 Peter Collingbourne 2021-11-22 81
e050ed271bb0008 Peter Collingbourne 2021-11-22 82 if (buf->kcur) {
e050ed271bb0008 Peter Collingbourne 2021-11-22 83 buf->kcur = 0;
e050ed271bb0008 Peter Collingbourne 2021-11-22 84 kfree(buf->kbegin);
e050ed271bb0008 Peter Collingbourne 2021-11-22 85 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 86 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 87
e050ed271bb0008 Peter Collingbourne 2021-11-22 88 void
__uaccess_buffer_syscall_entry(void)
e050ed271bb0008 Peter Collingbourne 2021-11-22 89 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 90 struct uaccess_buffer_info *buf =
¤t->uaccess_buffer;
e050ed271bb0008 Peter Collingbourne 2021-11-22 91 struct uaccess_descriptor desc;
e050ed271bb0008 Peter Collingbourne 2021-11-22 92
e050ed271bb0008 Peter Collingbourne 2021-11-22 93 if (get_user(buf->desc_ptr,
buf->desc_ptr_ptr) || !buf->desc_ptr ||
e050ed271bb0008 Peter Collingbourne 2021-11-22 94 put_user(0,
buf->desc_ptr_ptr) ||
e050ed271bb0008 Peter Collingbourne 2021-11-22 95 copy_from_user(&desc,
buf->desc_ptr, sizeof(desc)))
e050ed271bb0008 Peter Collingbourne 2021-11-22 96 return;
e050ed271bb0008 Peter Collingbourne 2021-11-22 97
e050ed271bb0008 Peter Collingbourne 2021-11-22 98 if (desc.size > 1024)
e050ed271bb0008 Peter Collingbourne 2021-11-22 99 desc.size = 1024;
e050ed271bb0008 Peter Collingbourne 2021-11-22 100
e050ed271bb0008 Peter Collingbourne 2021-11-22 101 buf->kbegin = kmalloc_array(
e050ed271bb0008 Peter Collingbourne 2021-11-22 102 desc.size, sizeof(struct
uaccess_buffer_entry), GFP_KERNEL);
e050ed271bb0008 Peter Collingbourne 2021-11-22 103 buf->kcur = buf->kbegin;
e050ed271bb0008 Peter Collingbourne 2021-11-22 104 buf->kend = buf->kbegin +
desc.size;
e050ed271bb0008 Peter Collingbourne 2021-11-22 105 buf->ubegin = (struct
uaccess_buffer_entry __user *)desc.addr;
e050ed271bb0008 Peter Collingbourne 2021-11-22 106 }
e050ed271bb0008 Peter Collingbourne 2021-11-22 107
e050ed271bb0008 Peter Collingbourne 2021-11-22 108 void
__uaccess_buffer_syscall_exit(void)
e050ed271bb0008 Peter Collingbourne 2021-11-22 109 {
e050ed271bb0008 Peter Collingbourne 2021-11-22 110 struct uaccess_buffer_info *buf =
¤t->uaccess_buffer;
e050ed271bb0008 Peter Collingbourne 2021-11-22 111 u64 num_entries = buf->kcur -
buf->kbegin;
e050ed271bb0008 Peter Collingbourne 2021-11-22 112 struct uaccess_descriptor desc;
e050ed271bb0008 Peter Collingbourne 2021-11-22 113
e050ed271bb0008 Peter Collingbourne 2021-11-22 114 if (!buf->kcur)
e050ed271bb0008 Peter Collingbourne 2021-11-22 115 return;
e050ed271bb0008 Peter Collingbourne 2021-11-22 116
e050ed271bb0008 Peter Collingbourne 2021-11-22 @117 desc.addr = (u64)(buf->ubegin +
num_entries);
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org