[linux-next:master 3067/3190] mm/khugepaged.c:1729:7: warning: variable 'index' is used uninitialized whenever 'if' condition is true

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head:   89bf6e28373beef9577fa71f996a5f73a569617c
commit: eae5270d3322f7838ced159e7e59be606f5db8e9 [3067/3190] mm/khugepaged: add tracepoint to collapse_file()
config: s390-randconfig-r004-20221024 (attached as .config)
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 791a7ae1ba3efd6bca96338e10ffde557ba83920)
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 s390 cross compiling tool for clang build
        # apt-get install binutils-s390x-linux-gnu
        # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=eae5270d3322f7838ced159e7e59be606f5db8e9
        git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
        git fetch --no-tags linux-next master
        git checkout eae5270d3322f7838ced159e7e59be606f5db8e9
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@xxxxxxxxx>

All warnings (new ones prefixed by >>):

>> mm/khugepaged.c:1729:7: warning: variable 'index' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
                   if (!xas_nomem(&xas, GFP_KERNEL)) {
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/khugepaged.c:2063:47: note: uninitialized use occurs here
           trace_mm_khugepaged_collapse_file(mm, hpage, index, is_shmem,
                                                        ^~~~~
   mm/khugepaged.c:1729:3: note: remove the 'if' if its condition is always false
                   if (!xas_nomem(&xas, GFP_KERNEL)) {
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/khugepaged.c:1716:6: warning: variable 'index' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (result != SCAN_SUCCEED)
               ^~~~~~~~~~~~~~~~~~~~~~
   mm/khugepaged.c:2063:47: note: uninitialized use occurs here
           trace_mm_khugepaged_collapse_file(mm, hpage, index, is_shmem,
                                                        ^~~~~
   mm/khugepaged.c:1716:2: note: remove the 'if' if its condition is always false
           if (result != SCAN_SUCCEED)
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/khugepaged.c:1705:15: note: initialize the variable 'index' to silence this warning
           pgoff_t index, end = start + HPAGE_PMD_NR;
                        ^
                         = 0
>> mm/khugepaged.c:1729:7: warning: variable 'nr' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
                   if (!xas_nomem(&xas, GFP_KERNEL)) {
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/khugepaged.c:2064:15: note: uninitialized use occurs here
                   addr, file, nr, result);
                               ^~
   mm/khugepaged.c:1729:3: note: remove the 'if' if its condition is always false
                   if (!xas_nomem(&xas, GFP_KERNEL)) {
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/khugepaged.c:1716:6: warning: variable 'nr' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (result != SCAN_SUCCEED)
               ^~~~~~~~~~~~~~~~~~~~~~
   mm/khugepaged.c:2064:15: note: uninitialized use occurs here
                   addr, file, nr, result);
                               ^~
   mm/khugepaged.c:1716:2: note: remove the 'if' if its condition is always false
           if (result != SCAN_SUCCEED)
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/khugepaged.c:1710:8: note: initialize the variable 'nr' to silence this warning
           int nr;
                 ^
                  = 0
   4 warnings generated.


vim +1729 mm/khugepaged.c

f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1674  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1675  /**
99cb0dbd47a15d Song Liu                2019-09-23  1676   * collapse_file - collapse filemap/tmpfs/shmem pages into huge one.
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1677   *
336e6b53d99ae3 Alex Shi                2020-12-14  1678   * @mm: process address space where collapse happens
34488399fa08fa Zach O'Keefe            2022-09-22  1679   * @addr: virtual collapse start address
336e6b53d99ae3 Alex Shi                2020-12-14  1680   * @file: file that collapse on
336e6b53d99ae3 Alex Shi                2020-12-14  1681   * @start: collapse start address
9710a78ab2aed0 Zach O'Keefe            2022-07-06  1682   * @cc: collapse context and scratchpad
336e6b53d99ae3 Alex Shi                2020-12-14  1683   *
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1684   * Basic scheme is simple, details are more complex:
87c460a0bded56 Hugh Dickins            2018-11-30  1685   *  - allocate and lock a new huge page;
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1686   *  - scan page cache replacing old pages with the new one
99cb0dbd47a15d Song Liu                2019-09-23  1687   *    + swap/gup in pages if necessary;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1688   *    + fill in gaps;
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1689   *    + keep old pages around in case rollback is required;
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1690   *  - if replacing succeeds:
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1691   *    + copy data over;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1692   *    + free old pages;
87c460a0bded56 Hugh Dickins            2018-11-30  1693   *    + unlock huge page;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1694   *  - if replacing failed;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1695   *    + put all pages back and unfreeze them;
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1696   *    + restore gaps in the page cache;
87c460a0bded56 Hugh Dickins            2018-11-30  1697   *    + unlock and free huge page;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1698   */
34488399fa08fa Zach O'Keefe            2022-09-22  1699  static int collapse_file(struct mm_struct *mm, unsigned long addr,
579c571e2efdb8 Song Liu                2019-09-23  1700  			 struct file *file, pgoff_t start,
34488399fa08fa Zach O'Keefe            2022-09-22  1701  			 struct collapse_control *cc)
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1702  {
579c571e2efdb8 Song Liu                2019-09-23  1703  	struct address_space *mapping = file->f_mapping;
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1704  	struct page *hpage;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1705  	pgoff_t index, end = start + HPAGE_PMD_NR;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1706  	LIST_HEAD(pagelist);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1707  	XA_STATE_ORDER(xas, &mapping->i_pages, start, HPAGE_PMD_ORDER);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1708  	int nr_none = 0, result = SCAN_SUCCEED;
99cb0dbd47a15d Song Liu                2019-09-23  1709  	bool is_shmem = shmem_file(file);
bf9ecead53c89d Muchun Song             2021-02-24  1710  	int nr;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1711  
99cb0dbd47a15d Song Liu                2019-09-23  1712  	VM_BUG_ON(!IS_ENABLED(CONFIG_READ_ONLY_THP_FOR_FS) && !is_shmem);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1713  	VM_BUG_ON(start & (HPAGE_PMD_NR - 1));
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1714  
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1715  	result = alloc_charge_hpage(&hpage, mm, cc);
9710a78ab2aed0 Zach O'Keefe            2022-07-06  1716  	if (result != SCAN_SUCCEED)
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1717  		goto out;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1718  
6b24ca4a1a8d4e Matthew Wilcox (Oracle  2020-06-27  1719) 	/*
6b24ca4a1a8d4e Matthew Wilcox (Oracle  2020-06-27  1720) 	 * Ensure we have slots for all the pages in the range.  This is
6b24ca4a1a8d4e Matthew Wilcox (Oracle  2020-06-27  1721) 	 * almost certainly a no-op because most of the pages must be present
6b24ca4a1a8d4e Matthew Wilcox (Oracle  2020-06-27  1722) 	 */
95feeabb77149f Hugh Dickins            2018-11-30  1723  	do {
95feeabb77149f Hugh Dickins            2018-11-30  1724  		xas_lock_irq(&xas);
95feeabb77149f Hugh Dickins            2018-11-30  1725  		xas_create_range(&xas);
95feeabb77149f Hugh Dickins            2018-11-30  1726  		if (!xas_error(&xas))
95feeabb77149f Hugh Dickins            2018-11-30  1727  			break;
95feeabb77149f Hugh Dickins            2018-11-30  1728  		xas_unlock_irq(&xas);
95feeabb77149f Hugh Dickins            2018-11-30 @1729  		if (!xas_nomem(&xas, GFP_KERNEL)) {
95feeabb77149f Hugh Dickins            2018-11-30  1730  			result = SCAN_FAIL;
95feeabb77149f Hugh Dickins            2018-11-30  1731  			goto out;
95feeabb77149f Hugh Dickins            2018-11-30  1732  		}
95feeabb77149f Hugh Dickins            2018-11-30  1733  	} while (1);
95feeabb77149f Hugh Dickins            2018-11-30  1734  
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1735  	__SetPageLocked(hpage);
99cb0dbd47a15d Song Liu                2019-09-23  1736  	if (is_shmem)
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1737  		__SetPageSwapBacked(hpage);
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1738  	hpage->index = start;
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1739  	hpage->mapping = mapping;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1740  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1741  	/*
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1742  	 * At this point the hpage is locked and not up-to-date.
87c460a0bded56 Hugh Dickins            2018-11-30  1743  	 * It's safe to insert it into the page cache, because nobody would
87c460a0bded56 Hugh Dickins            2018-11-30  1744  	 * be able to map it or use it in another way until we unlock it.
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1745  	 */
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1746  
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1747  	xas_set(&xas, start);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1748  	for (index = start; index < end; index++) {
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1749  		struct page *page = xas_next(&xas);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1750  
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1751  		VM_BUG_ON(index != xas.xa_index);
99cb0dbd47a15d Song Liu                2019-09-23  1752  		if (is_shmem) {
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1753  			if (!page) {
701270fa193aad Hugh Dickins            2018-11-30  1754  				/*
99cb0dbd47a15d Song Liu                2019-09-23  1755  				 * Stop if extent has been truncated or
99cb0dbd47a15d Song Liu                2019-09-23  1756  				 * hole-punched, and is now completely
99cb0dbd47a15d Song Liu                2019-09-23  1757  				 * empty.
701270fa193aad Hugh Dickins            2018-11-30  1758  				 */
701270fa193aad Hugh Dickins            2018-11-30  1759  				if (index == start) {
701270fa193aad Hugh Dickins            2018-11-30  1760  					if (!xas_next_entry(&xas, end - 1)) {
701270fa193aad Hugh Dickins            2018-11-30  1761  						result = SCAN_TRUNCATED;
042a30824871fa Hugh Dickins            2018-11-30  1762  						goto xa_locked;
701270fa193aad Hugh Dickins            2018-11-30  1763  					}
701270fa193aad Hugh Dickins            2018-11-30  1764  					xas_set(&xas, index);
701270fa193aad Hugh Dickins            2018-11-30  1765  				}
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1766  				if (!shmem_charge(mapping->host, 1)) {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1767  					result = SCAN_FAIL;
042a30824871fa Hugh Dickins            2018-11-30  1768  					goto xa_locked;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1769  				}
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1770  				xas_store(&xas, hpage);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1771  				nr_none++;
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1772  				continue;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1773  			}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1774  
3159f943aafdba Matthew Wilcox          2017-11-03  1775  			if (xa_is_value(page) || !PageUptodate(page)) {
7459c149ae9ca7 Matthew Wilcox (Oracle  2022-09-02  1776) 				struct folio *folio;
7459c149ae9ca7 Matthew Wilcox (Oracle  2022-09-02  1777) 
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1778  				xas_unlock_irq(&xas);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1779  				/* swap in or instantiate fallocated page */
7459c149ae9ca7 Matthew Wilcox (Oracle  2022-09-02  1780) 				if (shmem_get_folio(mapping->host, index,
7459c149ae9ca7 Matthew Wilcox (Oracle  2022-09-02  1781) 						&folio, SGP_NOALLOC)) {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1782  					result = SCAN_FAIL;
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1783  					goto xa_unlocked;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1784  				}
7459c149ae9ca7 Matthew Wilcox (Oracle  2022-09-02  1785) 				page = folio_file_page(folio, index);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1786  			} else if (trylock_page(page)) {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1787  				get_page(page);
042a30824871fa Hugh Dickins            2018-11-30  1788  				xas_unlock_irq(&xas);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1789  			} else {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1790  				result = SCAN_PAGE_LOCK;
042a30824871fa Hugh Dickins            2018-11-30  1791  				goto xa_locked;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1792  			}
99cb0dbd47a15d Song Liu                2019-09-23  1793  		} else {	/* !is_shmem */
99cb0dbd47a15d Song Liu                2019-09-23  1794  			if (!page || xa_is_value(page)) {
99cb0dbd47a15d Song Liu                2019-09-23  1795  				xas_unlock_irq(&xas);
99cb0dbd47a15d Song Liu                2019-09-23  1796  				page_cache_sync_readahead(mapping, &file->f_ra,
99cb0dbd47a15d Song Liu                2019-09-23  1797  							  file, index,
e5a59d308f52bb David Howells           2020-09-04  1798  							  end - index);
99cb0dbd47a15d Song Liu                2019-09-23  1799  				/* drain pagevecs to help isolate_lru_page() */
99cb0dbd47a15d Song Liu                2019-09-23  1800  				lru_add_drain();
99cb0dbd47a15d Song Liu                2019-09-23  1801  				page = find_lock_page(mapping, index);
99cb0dbd47a15d Song Liu                2019-09-23  1802  				if (unlikely(page == NULL)) {
99cb0dbd47a15d Song Liu                2019-09-23  1803  					result = SCAN_FAIL;
99cb0dbd47a15d Song Liu                2019-09-23  1804  					goto xa_unlocked;
99cb0dbd47a15d Song Liu                2019-09-23  1805  				}
75f360696ce9d8 Song Liu                2019-11-30  1806  			} else if (PageDirty(page)) {
75f360696ce9d8 Song Liu                2019-11-30  1807  				/*
75f360696ce9d8 Song Liu                2019-11-30  1808  				 * khugepaged only works on read-only fd,
75f360696ce9d8 Song Liu                2019-11-30  1809  				 * so this page is dirty because it hasn't
75f360696ce9d8 Song Liu                2019-11-30  1810  				 * been flushed since first write. There
75f360696ce9d8 Song Liu                2019-11-30  1811  				 * won't be new dirty pages.
75f360696ce9d8 Song Liu                2019-11-30  1812  				 *
75f360696ce9d8 Song Liu                2019-11-30  1813  				 * Trigger async flush here and hope the
75f360696ce9d8 Song Liu                2019-11-30  1814  				 * writeback is done when khugepaged
75f360696ce9d8 Song Liu                2019-11-30  1815  				 * revisits this page.
75f360696ce9d8 Song Liu                2019-11-30  1816  				 *
75f360696ce9d8 Song Liu                2019-11-30  1817  				 * This is a one-off situation. We are not
75f360696ce9d8 Song Liu                2019-11-30  1818  				 * forcing writeback in loop.
75f360696ce9d8 Song Liu                2019-11-30  1819  				 */
75f360696ce9d8 Song Liu                2019-11-30  1820  				xas_unlock_irq(&xas);
75f360696ce9d8 Song Liu                2019-11-30  1821  				filemap_flush(mapping);
75f360696ce9d8 Song Liu                2019-11-30  1822  				result = SCAN_FAIL;
75f360696ce9d8 Song Liu                2019-11-30  1823  				goto xa_unlocked;
74c42e1baacf20 Rongwei Wang            2021-10-28  1824  			} else if (PageWriteback(page)) {
74c42e1baacf20 Rongwei Wang            2021-10-28  1825  				xas_unlock_irq(&xas);
74c42e1baacf20 Rongwei Wang            2021-10-28  1826  				result = SCAN_FAIL;
74c42e1baacf20 Rongwei Wang            2021-10-28  1827  				goto xa_unlocked;
99cb0dbd47a15d Song Liu                2019-09-23  1828  			} else if (trylock_page(page)) {
99cb0dbd47a15d Song Liu                2019-09-23  1829  				get_page(page);
99cb0dbd47a15d Song Liu                2019-09-23  1830  				xas_unlock_irq(&xas);
99cb0dbd47a15d Song Liu                2019-09-23  1831  			} else {
99cb0dbd47a15d Song Liu                2019-09-23  1832  				result = SCAN_PAGE_LOCK;
99cb0dbd47a15d Song Liu                2019-09-23  1833  				goto xa_locked;
99cb0dbd47a15d Song Liu                2019-09-23  1834  			}
99cb0dbd47a15d Song Liu                2019-09-23  1835  		}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1836  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1837  		/*
b93b016313b3ba Matthew Wilcox          2018-04-10  1838  		 * The page must be locked, so we can drop the i_pages lock
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1839  		 * without racing with truncate.
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1840  		 */
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1841  		VM_BUG_ON_PAGE(!PageLocked(page), page);
4655e5e5f38726 Song Liu                2019-11-15  1842  
4655e5e5f38726 Song Liu                2019-11-15  1843  		/* make sure the page is up to date */
4655e5e5f38726 Song Liu                2019-11-15  1844  		if (unlikely(!PageUptodate(page))) {
4655e5e5f38726 Song Liu                2019-11-15  1845  			result = SCAN_FAIL;
4655e5e5f38726 Song Liu                2019-11-15  1846  			goto out_unlock;
4655e5e5f38726 Song Liu                2019-11-15  1847  		}
06a5e1268a5fb9 Hugh Dickins            2018-11-30  1848  
06a5e1268a5fb9 Hugh Dickins            2018-11-30  1849  		/*
06a5e1268a5fb9 Hugh Dickins            2018-11-30  1850  		 * If file was truncated then extended, or hole-punched, before
06a5e1268a5fb9 Hugh Dickins            2018-11-30  1851  		 * we locked the first page, then a THP might be there already.
58ac9a8993a13e Zach O'Keefe            2022-09-22  1852  		 * This will be discovered on the first iteration.
06a5e1268a5fb9 Hugh Dickins            2018-11-30  1853  		 */
06a5e1268a5fb9 Hugh Dickins            2018-11-30  1854  		if (PageTransCompound(page)) {
58ac9a8993a13e Zach O'Keefe            2022-09-22  1855  			struct page *head = compound_head(page);
58ac9a8993a13e Zach O'Keefe            2022-09-22  1856  
58ac9a8993a13e Zach O'Keefe            2022-09-22  1857  			result = compound_order(head) == HPAGE_PMD_ORDER &&
58ac9a8993a13e Zach O'Keefe            2022-09-22  1858  					head->index == start
58ac9a8993a13e Zach O'Keefe            2022-09-22  1859  					/* Maybe PMD-mapped */
58ac9a8993a13e Zach O'Keefe            2022-09-22  1860  					? SCAN_PTE_MAPPED_HUGEPAGE
58ac9a8993a13e Zach O'Keefe            2022-09-22  1861  					: SCAN_PAGE_COMPOUND;
06a5e1268a5fb9 Hugh Dickins            2018-11-30  1862  			goto out_unlock;
06a5e1268a5fb9 Hugh Dickins            2018-11-30  1863  		}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1864  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1865  		if (page_mapping(page) != mapping) {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1866  			result = SCAN_TRUNCATED;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1867  			goto out_unlock;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1868  		}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1869  
74c42e1baacf20 Rongwei Wang            2021-10-28  1870  		if (!is_shmem && (PageDirty(page) ||
74c42e1baacf20 Rongwei Wang            2021-10-28  1871  				  PageWriteback(page))) {
4655e5e5f38726 Song Liu                2019-11-15  1872  			/*
4655e5e5f38726 Song Liu                2019-11-15  1873  			 * khugepaged only works on read-only fd, so this
4655e5e5f38726 Song Liu                2019-11-15  1874  			 * page is dirty because it hasn't been flushed
4655e5e5f38726 Song Liu                2019-11-15  1875  			 * since first write.
4655e5e5f38726 Song Liu                2019-11-15  1876  			 */
4655e5e5f38726 Song Liu                2019-11-15  1877  			result = SCAN_FAIL;
4655e5e5f38726 Song Liu                2019-11-15  1878  			goto out_unlock;
4655e5e5f38726 Song Liu                2019-11-15  1879  		}
4655e5e5f38726 Song Liu                2019-11-15  1880  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1881  		if (isolate_lru_page(page)) {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1882  			result = SCAN_DEL_PAGE_LRU;
042a30824871fa Hugh Dickins            2018-11-30  1883  			goto out_unlock;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1884  		}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1885  
99cb0dbd47a15d Song Liu                2019-09-23  1886  		if (page_has_private(page) &&
99cb0dbd47a15d Song Liu                2019-09-23  1887  		    !try_to_release_page(page, GFP_KERNEL)) {
99cb0dbd47a15d Song Liu                2019-09-23  1888  			result = SCAN_PAGE_HAS_PRIVATE;
2f33a706027c94 Hugh Dickins            2020-05-27  1889  			putback_lru_page(page);
99cb0dbd47a15d Song Liu                2019-09-23  1890  			goto out_unlock;
99cb0dbd47a15d Song Liu                2019-09-23  1891  		}
99cb0dbd47a15d Song Liu                2019-09-23  1892  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1893  		if (page_mapped(page))
869f7ee6f64773 Matthew Wilcox (Oracle  2022-02-15  1894) 			try_to_unmap(page_folio(page),
869f7ee6f64773 Matthew Wilcox (Oracle  2022-02-15  1895) 					TTU_IGNORE_MLOCK | TTU_BATCH_FLUSH);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1896  
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1897  		xas_lock_irq(&xas);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1898  		xas_set(&xas, index);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1899  
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1900  		VM_BUG_ON_PAGE(page != xas_load(&xas), page);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1901  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1902  		/*
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1903  		 * The page is expected to have page_count() == 3:
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1904  		 *  - we hold a pin on it;
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1905  		 *  - one reference from page cache;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1906  		 *  - one from isolate_lru_page;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1907  		 */
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1908  		if (!page_ref_freeze(page, 3)) {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1909  			result = SCAN_PAGE_COUNT;
042a30824871fa Hugh Dickins            2018-11-30  1910  			xas_unlock_irq(&xas);
042a30824871fa Hugh Dickins            2018-11-30  1911  			putback_lru_page(page);
042a30824871fa Hugh Dickins            2018-11-30  1912  			goto out_unlock;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1913  		}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1914  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1915  		/*
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1916  		 * Add the page to the list to be able to undo the collapse if
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1917  		 * something go wrong.
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1918  		 */
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1919  		list_add_tail(&page->lru, &pagelist);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1920  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1921  		/* Finally, replace with the new page. */
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1922  		xas_store(&xas, hpage);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1923  		continue;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1924  out_unlock:
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1925  		unlock_page(page);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1926  		put_page(page);
042a30824871fa Hugh Dickins            2018-11-30  1927  		goto xa_unlocked;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1928  	}
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1929  	nr = thp_nr_pages(hpage);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1930  
99cb0dbd47a15d Song Liu                2019-09-23  1931  	if (is_shmem)
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1932  		__mod_lruvec_page_state(hpage, NR_SHMEM_THPS, nr);
09d91cda0e8207 Song Liu                2019-09-23  1933  	else {
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1934  		__mod_lruvec_page_state(hpage, NR_FILE_THPS, nr);
09d91cda0e8207 Song Liu                2019-09-23  1935  		filemap_nr_thps_inc(mapping);
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1936  		/*
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1937  		 * Paired with smp_mb() in do_dentry_open() to ensure
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1938  		 * i_writecount is up to date and the update to nr_thps is
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1939  		 * visible. Ensures the page cache will be truncated if the
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1940  		 * file is opened writable.
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1941  		 */
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1942  		smp_mb();
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1943  		if (inode_is_open_for_write(mapping->host)) {
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1944  			result = SCAN_FAIL;
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1945  			__mod_lruvec_page_state(hpage, NR_FILE_THPS, -nr);
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1946  			filemap_nr_thps_dec(mapping);
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1947  			goto xa_locked;
eb6ecbed0aa273 Collin Fijalkovich      2021-06-30  1948  		}
09d91cda0e8207 Song Liu                2019-09-23  1949  	}
99cb0dbd47a15d Song Liu                2019-09-23  1950  
042a30824871fa Hugh Dickins            2018-11-30  1951  	if (nr_none) {
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1952  		__mod_lruvec_page_state(hpage, NR_FILE_PAGES, nr_none);
2f55f070e5b80f Miaohe Lin              2022-06-25  1953  		/* nr_none is always 0 for non-shmem. */
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1954  		__mod_lruvec_page_state(hpage, NR_SHMEM, nr_none);
042a30824871fa Hugh Dickins            2018-11-30  1955  	}
042a30824871fa Hugh Dickins            2018-11-30  1956  
6b24ca4a1a8d4e Matthew Wilcox (Oracle  2020-06-27  1957) 	/* Join all the small entries into a single multi-index entry */
6b24ca4a1a8d4e Matthew Wilcox (Oracle  2020-06-27  1958) 	xas_set_order(&xas, start, HPAGE_PMD_ORDER);
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1959  	xas_store(&xas, hpage);
042a30824871fa Hugh Dickins            2018-11-30  1960  xa_locked:
042a30824871fa Hugh Dickins            2018-11-30  1961  	xas_unlock_irq(&xas);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1962  xa_unlocked:
042a30824871fa Hugh Dickins            2018-11-30  1963  
6d9df8a5889c56 Hugh Dickins            2022-02-14  1964  	/*
6d9df8a5889c56 Hugh Dickins            2022-02-14  1965  	 * If collapse is successful, flush must be done now before copying.
6d9df8a5889c56 Hugh Dickins            2022-02-14  1966  	 * If collapse is unsuccessful, does flush actually need to be done?
6d9df8a5889c56 Hugh Dickins            2022-02-14  1967  	 * Do it anyway, to clear the state.
6d9df8a5889c56 Hugh Dickins            2022-02-14  1968  	 */
6d9df8a5889c56 Hugh Dickins            2022-02-14  1969  	try_to_unmap_flush();
6d9df8a5889c56 Hugh Dickins            2022-02-14  1970  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1971  	if (result == SCAN_SUCCEED) {
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1972  		struct page *page, *tmp;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1973  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1974  		/*
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1975  		 * Replacing old pages with new one has succeeded, now we
77da9389b9d5f0 Matthew Wilcox          2017-12-04  1976  		 * need to copy the content and free the old pages.
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1977  		 */
2af8ff291848cc Hugh Dickins            2018-11-30  1978  		index = start;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1979  		list_for_each_entry_safe(page, tmp, &pagelist, lru) {
2af8ff291848cc Hugh Dickins            2018-11-30  1980  			while (index < page->index) {
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1981  				clear_highpage(hpage + (index % HPAGE_PMD_NR));
2af8ff291848cc Hugh Dickins            2018-11-30  1982  				index++;
2af8ff291848cc Hugh Dickins            2018-11-30  1983  			}
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1984  			copy_highpage(hpage + (page->index % HPAGE_PMD_NR),
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1985  				      page);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1986  			list_del(&page->lru);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1987  			page->mapping = NULL;
042a30824871fa Hugh Dickins            2018-11-30  1988  			page_ref_unfreeze(page, 1);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1989  			ClearPageActive(page);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1990  			ClearPageUnevictable(page);
042a30824871fa Hugh Dickins            2018-11-30  1991  			unlock_page(page);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1992  			put_page(page);
2af8ff291848cc Hugh Dickins            2018-11-30  1993  			index++;
2af8ff291848cc Hugh Dickins            2018-11-30  1994  		}
2af8ff291848cc Hugh Dickins            2018-11-30  1995  		while (index < end) {
50ad2f24b3b48c Zach O'Keefe            2022-07-06  1996  			clear_highpage(hpage + (index % HPAGE_PMD_NR));
2af8ff291848cc Hugh Dickins            2018-11-30  1997  			index++;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1998  		}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  1999  
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2000  		SetPageUptodate(hpage);
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2001  		page_ref_add(hpage, HPAGE_PMD_NR - 1);
6058eaec816f29 Johannes Weiner         2020-06-03  2002  		if (is_shmem)
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2003  			set_page_dirty(hpage);
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2004  		lru_cache_add(hpage);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2005  
042a30824871fa Hugh Dickins            2018-11-30  2006  		/*
042a30824871fa Hugh Dickins            2018-11-30  2007  		 * Remove pte page tables, so we can re-fault the page as huge.
042a30824871fa Hugh Dickins            2018-11-30  2008  		 */
34488399fa08fa Zach O'Keefe            2022-09-22  2009  		result = retract_page_tables(mapping, start, mm, addr, hpage,
34488399fa08fa Zach O'Keefe            2022-09-22  2010  					     cc);
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2011  		unlock_page(hpage);
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2012  		hpage = NULL;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2013  	} else {
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2014  		struct page *page;
aaa52e340073b7 Hugh Dickins            2018-11-30  2015  
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2016  		/* Something went wrong: roll back page cache changes */
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2017  		xas_lock_irq(&xas);
2f55f070e5b80f Miaohe Lin              2022-06-25  2018  		if (nr_none) {
aaa52e340073b7 Hugh Dickins            2018-11-30  2019  			mapping->nrpages -= nr_none;
aaa52e340073b7 Hugh Dickins            2018-11-30  2020  			shmem_uncharge(mapping->host, nr_none);
2f55f070e5b80f Miaohe Lin              2022-06-25  2021  		}
aaa52e340073b7 Hugh Dickins            2018-11-30  2022  
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2023  		xas_set(&xas, start);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2024  		xas_for_each(&xas, page, end - 1) {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2025  			page = list_first_entry_or_null(&pagelist,
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2026  					struct page, lru);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2027  			if (!page || xas.xa_index < page->index) {
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2028  				if (!nr_none)
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2029  					break;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2030  				nr_none--;
59749e6ce53735 Johannes Weiner         2016-12-12  2031  				/* Put holes back where they were */
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2032  				xas_store(&xas, NULL);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2033  				continue;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2034  			}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2035  
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2036  			VM_BUG_ON_PAGE(page->index != xas.xa_index, page);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2037  
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2038  			/* Unfreeze the page. */
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2039  			list_del(&page->lru);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2040  			page_ref_unfreeze(page, 2);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2041  			xas_store(&xas, page);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2042  			xas_pause(&xas);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2043  			xas_unlock_irq(&xas);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2044  			unlock_page(page);
042a30824871fa Hugh Dickins            2018-11-30  2045  			putback_lru_page(page);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2046  			xas_lock_irq(&xas);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2047  		}
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2048  		VM_BUG_ON(nr_none);
77da9389b9d5f0 Matthew Wilcox          2017-12-04  2049  		xas_unlock_irq(&xas);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2050  
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2051  		hpage->mapping = NULL;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2052  	}
042a30824871fa Hugh Dickins            2018-11-30  2053  
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2054  	if (hpage)
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2055  		unlock_page(hpage);
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2056  out:
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2057  	VM_BUG_ON(!list_empty(&pagelist));
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2058  	if (hpage) {
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2059  		mem_cgroup_uncharge(page_folio(hpage));
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2060  		put_page(hpage);
c6a7f445a2727a Yang Shi                2022-07-06  2061  	}
eae5270d3322f7 Gautam Menghani         2022-10-24  2062  
eae5270d3322f7 Gautam Menghani         2022-10-24  2063  	trace_mm_khugepaged_collapse_file(mm, hpage, index, is_shmem,
eae5270d3322f7 Gautam Menghani         2022-10-24  2064  		addr, file, nr, result);
50ad2f24b3b48c Zach O'Keefe            2022-07-06  2065  	return result;
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2066  }
f3f0e1d2150b2b Kirill A. Shutemov      2016-07-26  2067  

:::::: The code at line 1729 was first introduced by commit
:::::: 95feeabb77149f7d48f05bde61d75621c57db67e mm/khugepaged: fix the xas_create_range() error path

:::::: TO: Hugh Dickins <hughd@xxxxxxxxxx>
:::::: CC: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux