On 24.11.21 16:42, kernel test robot wrote: > tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master > head: 5d9f4cf36721aba199975a9be7863a3ff5cd4b59 > commit: c1e63117711977cc4295b2ce73de29dd17066c82 proc/vmcore: fix clearing user buffer by properly using clear_user() > date: 4 days ago > config: ia64-allyesconfig (https://download.01.org/0day-ci/archive/20211124/202111242331.x19Qywph-lkp@xxxxxxxxx/config) > compiler: ia64-linux-gcc (GCC) 11.2.0 > reproduce: > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # apt-get install sparse > # sparse version: v0.6.4-dirty > # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c1e63117711977cc4295b2ce73de29dd17066c82 > git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git > git fetch --no-tags linus master > git checkout c1e63117711977cc4295b2ce73de29dd17066c82 > # save the config file to linux build tree > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=ia64 > > If you fix the issue, kindly add following tag as appropriate > Reported-by: kernel test robot <lkp@xxxxxxxxx> > > > sparse warnings: (new ones prefixed by >>) >>> fs/proc/vmcore.c:161:34: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] __user *p @@ got char *buf @@ > fs/proc/vmcore.c:161:34: sparse: expected void const [noderef] __user *p > fs/proc/vmcore.c:161:34: sparse: got char *buf >>> fs/proc/vmcore.c:161:34: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user * @@ got char *buf @@ > fs/proc/vmcore.c:161:34: sparse: expected void [noderef] __user * > fs/proc/vmcore.c:161:34: sparse: got char *buf > > vim +161 fs/proc/vmcore.c > > 133 > 134 /* Reads a page from the oldmem device from given offset. */ > 135 ssize_t read_from_oldmem(char *buf, size_t count, > 136 u64 *ppos, int userbuf, > 137 bool encrypted) > 138 { > 139 unsigned long pfn, offset; > 140 size_t nr_bytes; > 141 ssize_t read = 0, tmp; > 142 > 143 if (!count) > 144 return 0; > 145 > 146 offset = (unsigned long)(*ppos % PAGE_SIZE); > 147 pfn = (unsigned long)(*ppos / PAGE_SIZE); > 148 > 149 down_read(&vmcore_cb_rwsem); > 150 do { > 151 if (count > (PAGE_SIZE - offset)) > 152 nr_bytes = PAGE_SIZE - offset; > 153 else > 154 nr_bytes = count; > 155 > 156 /* If pfn is not ram, return zeros for sparse dump files */ > 157 if (!pfn_is_ram(pfn)) { > 158 tmp = 0; > 159 if (!userbuf) > 160 memset(buf, 0, nr_bytes); > > 161 else if (clear_user(buf, nr_bytes)) > 162 tmp = -EFAULT; > 163 } else { > 164 if (encrypted) > 165 tmp = copy_oldmem_page_encrypted(pfn, buf, > 166 nr_bytes, > 167 offset, > 168 userbuf); > 169 else > 170 tmp = copy_oldmem_page(pfn, buf, nr_bytes, > 171 offset, userbuf); > 172 } > 173 if (tmp < 0) { > 174 up_read(&vmcore_cb_rwsem); > 175 return tmp; > 176 } > 177 > 178 *ppos += nr_bytes; > 179 count -= nr_bytes; > 180 buf += nr_bytes; > 181 read += nr_bytes; > 182 ++pfn; > 183 offset = 0; > 184 } while (count); > 185 > 186 up_read(&vmcore_cb_rwsem); > 187 return read; > 188 } > 189 Sparse is wrong as it doesn't see the bigger picture. "int userbuf" tells us what we're actually dealing with ... -- Thanks, David / dhildenb