lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date:   Mon, 21 Dec 2020 14:24:36 +0800
From:   kernel test robot <lkp@...el.com>
To:     Kees Cook <keescook@...omium.org>
Cc:     kbuild-all@...ts.01.org, clang-built-linux@...glegroups.com,
        linux-kernel@...r.kernel.org,
        Nathan Chancellor <natechancellor@...il.com>,
        Andrew Morton <akpm@...ux-foundation.org>,
        Linux Memory Management List <linux-mm@...ck.org>
Subject: mm/filemap.c:2439:9: warning: stack frame size of 2096 bytes in
 function 'generic_file_buffered_read'

Hi Kees,

First bad commit (maybe != root cause):

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   467f8165a2b0e6accf3d0dd9c8089b1dbde29f7f
commit: cdf8a76fda4ae3b53c5a09e5a8c79e27b7b65d68 ubsan: move cc-option tests into Kconfig
date:   5 days ago
config: powerpc-randconfig-r002-20201220 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project cee1e7d14f4628d6174b33640d502bff3b54ae45)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install powerpc cross compiling tool for clang build
        # apt-get install binutils-powerpc-linux-gnu
        # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cdf8a76fda4ae3b53c5a09e5a8c79e27b7b65d68
        git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout cdf8a76fda4ae3b53c5a09e5a8c79e27b7b65d68
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=powerpc 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@...el.com>

All warnings (new ones prefixed by >>):

   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:45:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(insw, (unsigned long p, void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:156:1: note: expanded from here
   __do_insw
   ^
   arch/powerpc/include/asm/io.h:542:56: note: expanded from macro '__do_insw'
   #define __do_insw(p, b, n)      readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
                                          ~~~~~~~~~~~~~~~~~~~~~^
   In file included from mm/filemap.c:20:
   In file included from include/linux/kernel_stat.h:9:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:47:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(insl, (unsigned long p, void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:160:1: note: expanded from here
   __do_insl
   ^
   arch/powerpc/include/asm/io.h:543:56: note: expanded from macro '__do_insl'
   #define __do_insl(p, b, n)      readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
                                          ~~~~~~~~~~~~~~~~~~~~~^
   In file included from mm/filemap.c:20:
   In file included from include/linux/kernel_stat.h:9:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:49:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsb, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:164:1: note: expanded from here
   __do_outsb
   ^
   arch/powerpc/include/asm/io.h:544:58: note: expanded from macro '__do_outsb'
   #define __do_outsb(p, b, n)     writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
   In file included from mm/filemap.c:20:
   In file included from include/linux/kernel_stat.h:9:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:51:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsw, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:168:1: note: expanded from here
   __do_outsw
   ^
   arch/powerpc/include/asm/io.h:545:58: note: expanded from macro '__do_outsw'
   #define __do_outsw(p, b, n)     writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
   In file included from mm/filemap.c:20:
   In file included from include/linux/kernel_stat.h:9:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:53:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsl, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:172:1: note: expanded from here
   __do_outsl
   ^
   arch/powerpc/include/asm/io.h:546:58: note: expanded from macro '__do_outsl'
   #define __do_outsl(p, b, n)     writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
   mm/filemap.c:830:14: warning: no previous prototype for function '__add_to_page_cache_locked' [-Wmissing-prototypes]
   noinline int __add_to_page_cache_locked(struct page *page,
                ^
   mm/filemap.c:830:10: note: declare 'static' if the function is not intended to be used outside of this translation unit
   noinline int __add_to_page_cache_locked(struct page *page,
            ^
            static 
>> mm/filemap.c:2439:9: warning: stack frame size of 2096 bytes in function 'generic_file_buffered_read' [-Wframe-larger-than=]
   ssize_t generic_file_buffered_read(struct kiocb *iocb,
           ^
   14 warnings generated.
--
   In file included from kernel/debug/gdbstub.c:35:
   In file included from include/linux/serial_core.h:13:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:45:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(insw, (unsigned long p, void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:85:1: note: expanded from here
   __do_insw
   ^
   arch/powerpc/include/asm/io.h:542:56: note: expanded from macro '__do_insw'
   #define __do_insw(p, b, n)      readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
                                          ~~~~~~~~~~~~~~~~~~~~~^
   In file included from kernel/debug/gdbstub.c:35:
   In file included from include/linux/serial_core.h:13:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:47:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(insl, (unsigned long p, void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:89:1: note: expanded from here
   __do_insl
   ^
   arch/powerpc/include/asm/io.h:543:56: note: expanded from macro '__do_insl'
   #define __do_insl(p, b, n)      readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
                                          ~~~~~~~~~~~~~~~~~~~~~^
   In file included from kernel/debug/gdbstub.c:35:
   In file included from include/linux/serial_core.h:13:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:49:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsb, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:93:1: note: expanded from here
   __do_outsb
   ^
   arch/powerpc/include/asm/io.h:544:58: note: expanded from macro '__do_outsb'
   #define __do_outsb(p, b, n)     writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
   In file included from kernel/debug/gdbstub.c:35:
   In file included from include/linux/serial_core.h:13:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:51:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsw, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:97:1: note: expanded from here
   __do_outsw
   ^
   arch/powerpc/include/asm/io.h:545:58: note: expanded from macro '__do_outsw'
   #define __do_outsw(p, b, n)     writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
   In file included from kernel/debug/gdbstub.c:35:
   In file included from include/linux/serial_core.h:13:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:10:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:604:
   arch/powerpc/include/asm/io-defs.h:53:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsl, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:601:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:101:1: note: expanded from here
   __do_outsl
   ^
   arch/powerpc/include/asm/io.h:546:58: note: expanded from macro '__do_outsl'
   #define __do_outsl(p, b, n)     writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
>> kernel/debug/gdbstub.c:957:5: warning: stack frame size of 2192 bytes in function 'gdb_serial_stub' [-Wframe-larger-than=]
   int gdb_serial_stub(struct kgdb_state *ks)
       ^
   13 warnings generated.


vim +/generic_file_buffered_read +2439 mm/filemap.c

06c0444290cecf0 Kent Overstreet   2020-12-14  2422  
723ef24b9b379e5 Kent Overstreet   2020-12-14  2423  /**
723ef24b9b379e5 Kent Overstreet   2020-12-14  2424   * generic_file_buffered_read - generic file read routine
723ef24b9b379e5 Kent Overstreet   2020-12-14  2425   * @iocb:	the iocb to read
723ef24b9b379e5 Kent Overstreet   2020-12-14  2426   * @iter:	data destination
723ef24b9b379e5 Kent Overstreet   2020-12-14  2427   * @written:	already copied
723ef24b9b379e5 Kent Overstreet   2020-12-14  2428   *
723ef24b9b379e5 Kent Overstreet   2020-12-14  2429   * This is a generic file read routine, and uses the
723ef24b9b379e5 Kent Overstreet   2020-12-14  2430   * mapping->a_ops->readpage() function for the actual low-level stuff.
723ef24b9b379e5 Kent Overstreet   2020-12-14  2431   *
723ef24b9b379e5 Kent Overstreet   2020-12-14  2432   * This is really ugly. But the goto's actually try to clarify some
723ef24b9b379e5 Kent Overstreet   2020-12-14  2433   * of the logic when it comes to error handling etc.
723ef24b9b379e5 Kent Overstreet   2020-12-14  2434   *
723ef24b9b379e5 Kent Overstreet   2020-12-14  2435   * Return:
723ef24b9b379e5 Kent Overstreet   2020-12-14  2436   * * total number of bytes copied, including those the were already @written
723ef24b9b379e5 Kent Overstreet   2020-12-14  2437   * * negative error code if nothing was copied
723ef24b9b379e5 Kent Overstreet   2020-12-14  2438   */
723ef24b9b379e5 Kent Overstreet   2020-12-14 @2439  ssize_t generic_file_buffered_read(struct kiocb *iocb,
723ef24b9b379e5 Kent Overstreet   2020-12-14  2440  		struct iov_iter *iter, ssize_t written)
723ef24b9b379e5 Kent Overstreet   2020-12-14  2441  {
723ef24b9b379e5 Kent Overstreet   2020-12-14  2442  	struct file *filp = iocb->ki_filp;
06c0444290cecf0 Kent Overstreet   2020-12-14  2443  	struct file_ra_state *ra = &filp->f_ra;
723ef24b9b379e5 Kent Overstreet   2020-12-14  2444  	struct address_space *mapping = filp->f_mapping;
723ef24b9b379e5 Kent Overstreet   2020-12-14  2445  	struct inode *inode = mapping->host;
06c0444290cecf0 Kent Overstreet   2020-12-14  2446  	struct page *pages_onstack[PAGEVEC_SIZE], **pages = NULL;
06c0444290cecf0 Kent Overstreet   2020-12-14  2447  	unsigned int nr_pages = min_t(unsigned int, 512,
06c0444290cecf0 Kent Overstreet   2020-12-14  2448  			((iocb->ki_pos + iter->count + PAGE_SIZE - 1) >> PAGE_SHIFT) -
06c0444290cecf0 Kent Overstreet   2020-12-14  2449  			(iocb->ki_pos >> PAGE_SHIFT));
06c0444290cecf0 Kent Overstreet   2020-12-14  2450  	int i, pg_nr, error = 0;
06c0444290cecf0 Kent Overstreet   2020-12-14  2451  	bool writably_mapped;
06c0444290cecf0 Kent Overstreet   2020-12-14  2452  	loff_t isize, end_offset;
723ef24b9b379e5 Kent Overstreet   2020-12-14  2453  
723ef24b9b379e5 Kent Overstreet   2020-12-14  2454  	if (unlikely(iocb->ki_pos >= inode->i_sb->s_maxbytes))
723ef24b9b379e5 Kent Overstreet   2020-12-14  2455  		return 0;
723ef24b9b379e5 Kent Overstreet   2020-12-14  2456  	iov_iter_truncate(iter, inode->i_sb->s_maxbytes);
723ef24b9b379e5 Kent Overstreet   2020-12-14  2457  
06c0444290cecf0 Kent Overstreet   2020-12-14  2458  	if (nr_pages > ARRAY_SIZE(pages_onstack))
06c0444290cecf0 Kent Overstreet   2020-12-14  2459  		pages = kmalloc_array(nr_pages, sizeof(void *), GFP_KERNEL);
06c0444290cecf0 Kent Overstreet   2020-12-14  2460  
06c0444290cecf0 Kent Overstreet   2020-12-14  2461  	if (!pages) {
06c0444290cecf0 Kent Overstreet   2020-12-14  2462  		pages = pages_onstack;
06c0444290cecf0 Kent Overstreet   2020-12-14  2463  		nr_pages = min_t(unsigned int, nr_pages, ARRAY_SIZE(pages_onstack));
06c0444290cecf0 Kent Overstreet   2020-12-14  2464  	}
06c0444290cecf0 Kent Overstreet   2020-12-14  2465  
06c0444290cecf0 Kent Overstreet   2020-12-14  2466  	do {
06c0444290cecf0 Kent Overstreet   2020-12-14  2467  		cond_resched();
723ef24b9b379e5 Kent Overstreet   2020-12-14  2468  
^1da177e4c3f415 Linus Torvalds    2005-04-16  2469  		/*
723ef24b9b379e5 Kent Overstreet   2020-12-14  2470  		 * If we've already successfully copied some data, then we
723ef24b9b379e5 Kent Overstreet   2020-12-14  2471  		 * can no longer safely return -EIOCBQUEUED. Hence mark
723ef24b9b379e5 Kent Overstreet   2020-12-14  2472  		 * an async read NOWAIT at that point.
^1da177e4c3f415 Linus Torvalds    2005-04-16  2473  		 */
06c0444290cecf0 Kent Overstreet   2020-12-14  2474  		if ((iocb->ki_flags & IOCB_WAITQ) && written)
723ef24b9b379e5 Kent Overstreet   2020-12-14  2475  			iocb->ki_flags |= IOCB_NOWAIT;
^1da177e4c3f415 Linus Torvalds    2005-04-16  2476  
06c0444290cecf0 Kent Overstreet   2020-12-14  2477  		i = 0;
06c0444290cecf0 Kent Overstreet   2020-12-14  2478  		pg_nr = generic_file_buffered_read_get_pages(iocb, iter,
06c0444290cecf0 Kent Overstreet   2020-12-14  2479  							     pages, nr_pages);
06c0444290cecf0 Kent Overstreet   2020-12-14  2480  		if (pg_nr < 0) {
06c0444290cecf0 Kent Overstreet   2020-12-14  2481  			error = pg_nr;
06c0444290cecf0 Kent Overstreet   2020-12-14  2482  			break;
723ef24b9b379e5 Kent Overstreet   2020-12-14  2483  		}
^1da177e4c3f415 Linus Torvalds    2005-04-16  2484  
^1da177e4c3f415 Linus Torvalds    2005-04-16  2485  		/*
06c0444290cecf0 Kent Overstreet   2020-12-14  2486  		 * i_size must be checked after we know the pages are Uptodate.
06c0444290cecf0 Kent Overstreet   2020-12-14  2487  		 *
06c0444290cecf0 Kent Overstreet   2020-12-14  2488  		 * Checking i_size after the check allows us to calculate
06c0444290cecf0 Kent Overstreet   2020-12-14  2489  		 * the correct value for "nr", which means the zero-filled
06c0444290cecf0 Kent Overstreet   2020-12-14  2490  		 * part of the page is not copied back to userspace (unless
06c0444290cecf0 Kent Overstreet   2020-12-14  2491  		 * another truncate extends the file - this is desired though).
^1da177e4c3f415 Linus Torvalds    2005-04-16  2492  		 */
06c0444290cecf0 Kent Overstreet   2020-12-14  2493  		isize = i_size_read(inode);
06c0444290cecf0 Kent Overstreet   2020-12-14  2494  		if (unlikely(iocb->ki_pos >= isize))
06c0444290cecf0 Kent Overstreet   2020-12-14  2495  			goto put_pages;
723ef24b9b379e5 Kent Overstreet   2020-12-14  2496  
06c0444290cecf0 Kent Overstreet   2020-12-14  2497  		end_offset = min_t(loff_t, isize, iocb->ki_pos + iter->count);
723ef24b9b379e5 Kent Overstreet   2020-12-14  2498  
06c0444290cecf0 Kent Overstreet   2020-12-14  2499  		while ((iocb->ki_pos >> PAGE_SHIFT) + pg_nr >
06c0444290cecf0 Kent Overstreet   2020-12-14  2500  		       (end_offset + PAGE_SIZE - 1) >> PAGE_SHIFT)
06c0444290cecf0 Kent Overstreet   2020-12-14  2501  			put_page(pages[--pg_nr]);
723ef24b9b379e5 Kent Overstreet   2020-12-14  2502  
06c0444290cecf0 Kent Overstreet   2020-12-14  2503  		/*
06c0444290cecf0 Kent Overstreet   2020-12-14  2504  		 * Once we start copying data, we don't want to be touching any
06c0444290cecf0 Kent Overstreet   2020-12-14  2505  		 * cachelines that might be contended:
06c0444290cecf0 Kent Overstreet   2020-12-14  2506  		 */
06c0444290cecf0 Kent Overstreet   2020-12-14  2507  		writably_mapped = mapping_writably_mapped(mapping);
06c0444290cecf0 Kent Overstreet   2020-12-14  2508  
06c0444290cecf0 Kent Overstreet   2020-12-14  2509  		/*
06c0444290cecf0 Kent Overstreet   2020-12-14  2510  		 * When a sequential read accesses a page several times, only
06c0444290cecf0 Kent Overstreet   2020-12-14  2511  		 * mark it as accessed the first time.
06c0444290cecf0 Kent Overstreet   2020-12-14  2512  		 */
06c0444290cecf0 Kent Overstreet   2020-12-14  2513  		if (iocb->ki_pos >> PAGE_SHIFT !=
06c0444290cecf0 Kent Overstreet   2020-12-14  2514  		    ra->prev_pos >> PAGE_SHIFT)
06c0444290cecf0 Kent Overstreet   2020-12-14  2515  			mark_page_accessed(pages[0]);
06c0444290cecf0 Kent Overstreet   2020-12-14  2516  		for (i = 1; i < pg_nr; i++)
06c0444290cecf0 Kent Overstreet   2020-12-14  2517  			mark_page_accessed(pages[i]);
06c0444290cecf0 Kent Overstreet   2020-12-14  2518  
06c0444290cecf0 Kent Overstreet   2020-12-14  2519  		for (i = 0; i < pg_nr; i++) {
06c0444290cecf0 Kent Overstreet   2020-12-14  2520  			unsigned int offset = iocb->ki_pos & ~PAGE_MASK;
06c0444290cecf0 Kent Overstreet   2020-12-14  2521  			unsigned int bytes = min_t(loff_t, end_offset - iocb->ki_pos,
06c0444290cecf0 Kent Overstreet   2020-12-14  2522  						   PAGE_SIZE - offset);
06c0444290cecf0 Kent Overstreet   2020-12-14  2523  			unsigned int copied;
06c0444290cecf0 Kent Overstreet   2020-12-14  2524  
06c0444290cecf0 Kent Overstreet   2020-12-14  2525  			/*
06c0444290cecf0 Kent Overstreet   2020-12-14  2526  			 * If users can be writing to this page using arbitrary
06c0444290cecf0 Kent Overstreet   2020-12-14  2527  			 * virtual addresses, take care about potential aliasing
06c0444290cecf0 Kent Overstreet   2020-12-14  2528  			 * before reading the page on the kernel side.
06c0444290cecf0 Kent Overstreet   2020-12-14  2529  			 */
06c0444290cecf0 Kent Overstreet   2020-12-14  2530  			if (writably_mapped)
06c0444290cecf0 Kent Overstreet   2020-12-14  2531  				flush_dcache_page(pages[i]);
06c0444290cecf0 Kent Overstreet   2020-12-14  2532  
06c0444290cecf0 Kent Overstreet   2020-12-14  2533  			copied = copy_page_to_iter(pages[i], offset, bytes, iter);
06c0444290cecf0 Kent Overstreet   2020-12-14  2534  
06c0444290cecf0 Kent Overstreet   2020-12-14  2535  			written += copied;
06c0444290cecf0 Kent Overstreet   2020-12-14  2536  			iocb->ki_pos += copied;
06c0444290cecf0 Kent Overstreet   2020-12-14  2537  			ra->prev_pos = iocb->ki_pos;
06c0444290cecf0 Kent Overstreet   2020-12-14  2538  
06c0444290cecf0 Kent Overstreet   2020-12-14  2539  			if (copied < bytes) {
06c0444290cecf0 Kent Overstreet   2020-12-14  2540  				error = -EFAULT;
06c0444290cecf0 Kent Overstreet   2020-12-14  2541  				break;
^1da177e4c3f415 Linus Torvalds    2005-04-16  2542  			}
^1da177e4c3f415 Linus Torvalds    2005-04-16  2543  		}
06c0444290cecf0 Kent Overstreet   2020-12-14  2544  put_pages:
06c0444290cecf0 Kent Overstreet   2020-12-14  2545  		for (i = 0; i < pg_nr; i++)
06c0444290cecf0 Kent Overstreet   2020-12-14  2546  			put_page(pages[i]);
06c0444290cecf0 Kent Overstreet   2020-12-14  2547  	} while (iov_iter_count(iter) && iocb->ki_pos < isize && !error);
^1da177e4c3f415 Linus Torvalds    2005-04-16  2548  
^1da177e4c3f415 Linus Torvalds    2005-04-16  2549  	file_accessed(filp);
06c0444290cecf0 Kent Overstreet   2020-12-14  2550  
06c0444290cecf0 Kent Overstreet   2020-12-14  2551  	if (pages != pages_onstack)
06c0444290cecf0 Kent Overstreet   2020-12-14  2552  		kfree(pages);
723ef24b9b379e5 Kent Overstreet   2020-12-14  2553  
6e58e79db8a1622 Al Viro           2014-02-03  2554  	return written ? written : error;
^1da177e4c3f415 Linus Torvalds    2005-04-16  2555  }
d85dc2e116fdce7 Goldwyn Rodrigues 2019-08-30  2556  EXPORT_SYMBOL_GPL(generic_file_buffered_read);
^1da177e4c3f415 Linus Torvalds    2005-04-16  2557  

:::::: The code at line 2439 was first introduced by commit
:::::: 723ef24b9b379e59facc65de8c065c8b89d479cd mm/filemap/c: break generic_file_buffered_read up into multiple functions

:::::: TO: Kent Overstreet <kent.overstreet@...il.com>
:::::: CC: Linus Torvalds <torvalds@...ux-foundation.org>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

Download attachment ".config.gz" of type "application/gzip" (18388 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ