Re: [PATCH 2/2] fs: generic_file_buffered_read() now uses find_get_pages_contig
From: kbuild test robot
Date: Thu Aug 16 2018 - 10:57:51 EST
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
Attachment:
.config.gz
Description: application/gzip