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