Hi Kent, I love your patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on v4.18 next-20180816] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Kent-Overstreet/generic_file_buffered_read-improvements/20180816-200515 config: sparc64-allmodconfig (attached as .config) compiler: sparc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree GCC_VERSION=7.2.0 make.cross ARCH=sparc64 All errors (new ones prefixed by >>): mm/filemap.c: In function 'generic_file_buffered_read': >> mm/filemap.c:2340:23: error: 'page' undeclared (first use in this function) flush_dcache_page(page); ^~~~ mm/filemap.c:2340:23: note: each undeclared identifier is reported only once for each function it appears in vim +/page +2340 mm/filemap.c 2253 2254 /** 2255 * generic_file_buffered_read - generic file read routine 2256 * @iocb: the iocb to read 2257 * @iter: data destination 2258 * @written: already copied 2259 * 2260 * This is a generic file read routine, and uses the 2261 * mapping->a_ops->readpage() function for the actual low-level stuff. 2262 * 2263 * This is really ugly. But the goto's actually try to clarify some 2264 * of the logic when it comes to error handling etc. 2265 */ 2266 static ssize_t generic_file_buffered_read(struct kiocb *iocb, 2267 struct iov_iter *iter, ssize_t written) 2268 { 2269 struct file *filp = iocb->ki_filp; 2270 struct file_ra_state *ra = &filp->f_ra; 2271 struct address_space *mapping = filp->f_mapping; 2272 struct inode *inode = mapping->host; 2273 size_t orig_count = iov_iter_count(iter); 2274 struct page *pages[64]; 2275 int i, pg_nr, error = 0; 2276 bool writably_mapped; 2277 loff_t isize, end_offset; 2278 2279 if (unlikely(iocb->ki_pos >= inode->i_sb->s_maxbytes)) 2280 return 0; 2281 iov_iter_truncate(iter, inode->i_sb->s_maxbytes); 2282 2283 do { 2284 cond_resched(); 2285 2286 i = 0; 2287 pg_nr = generic_file_buffered_read_get_pages(iocb, iter, pages, 2288 ARRAY_SIZE(pages)); 2289 if (pg_nr < 0) { 2290 error = pg_nr; 2291 break; 2292 } 2293 2294 /* 2295 * i_size must be checked after we know the pages are Uptodate. 2296 * 2297 * Checking i_size after the check allows us to calculate 2298 * the correct value for "nr", which means the zero-filled 2299 * part of the page is not copied back to userspace (unless 2300 * another truncate extends the file - this is desired though). 2301 */ 2302 isize = i_size_read(inode); 2303 if (unlikely(iocb->ki_pos >= isize)) 2304 goto put_pages; 2305 2306 end_offset = min_t(loff_t, isize, iocb->ki_pos + iter->count); 2307 2308 while ((iocb->ki_pos >> PAGE_SHIFT) + pg_nr > 2309 (end_offset + PAGE_SIZE - 1) >> PAGE_SHIFT) 2310 put_page(pages[--pg_nr]); 2311 2312 /* 2313 * Once we start copying data, we don't want to be touching any 2314 * cachelines that might be contended: 2315 */ 2316 writably_mapped = mapping_writably_mapped(mapping); 2317 2318 /* 2319 * When a sequential read accesses a page several times, only 2320 * mark it as accessed the first time. 2321 */ 2322 if (iocb->ki_pos >> PAGE_SHIFT != 2323 ra->prev_pos >> PAGE_SHIFT) 2324 mark_page_accessed(pages[0]); 2325 for (i = 1; i < pg_nr; i++) 2326 mark_page_accessed(pages[i]); 2327 2328 for (i = 0; i < pg_nr; i++) { 2329 unsigned offset = iocb->ki_pos & ~PAGE_MASK; 2330 unsigned bytes = min_t(loff_t, end_offset - iocb->ki_pos, 2331 PAGE_SIZE - offset); 2332 unsigned copied; 2333 2334 /* 2335 * If users can be writing to this page using arbitrary 2336 * virtual addresses, take care about potential aliasing 2337 * before reading the page on the kernel side. 2338 */ 2339 if (writably_mapped) > 2340 flush_dcache_page(page); 2341 2342 copied = copy_page_to_iter(pages[i], offset, bytes, iter); 2343 2344 iocb->ki_pos += copied; 2345 ra->prev_pos = iocb->ki_pos; 2346 2347 if (copied < bytes) { 2348 error = -EFAULT; 2349 break; 2350 } 2351 } 2352 put_pages: 2353 for (i = 0; i < pg_nr; i++) 2354 put_page(pages[i]); 2355 } while (iov_iter_count(iter) && iocb->ki_pos < isize && !error); 2356 2357 file_accessed(filp); 2358 written += orig_count - iov_iter_count(iter); 2359 2360 return written ? written : error; 2361 } 2362 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation