CC: [email protected] CC: [email protected] TO: Alistair Popple <[email protected]> CC: Christoph Hellwig <[email protected]> CC: Ralph Campbell <[email protected]> CC: Andrew Morton <[email protected]> CC: Linux Memory Management List <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: f55966571d5eb2876a11e48e798b4592fa1ffbb7 commit: a98a2f0c8ce1b2138cb8e3ae410444dedcc14809 mm/rmap: split migration into its own function date: 8 days ago :::::: branch date: 25 hours ago :::::: commit date: 8 days ago config: parisc-randconfig-s032-20210709 (attached as .config) compiler: hppa64-linux-gcc (GCC) 9.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.3-341-g8af24329-dirty # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a98a2f0c8ce1b2138cb8e3ae410444dedcc14809 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout a98a2f0c8ce1b2138cb8e3ae410444dedcc14809 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=parisc SHELL=/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> sparse warnings: (new ones prefixed by >>) mm/rmap.c: note: in included file (through include/linux/export.h, include/linux/linkage.h, include/linux/kernel.h, ...): ./include/generated/autoksyms.h:5:16: sparse: sparse: no whitespace before object-like macro body ./include/generated/autoksyms.h:6:16: sparse: sparse: no whitespace before object-like macro body ./include/generated/autoksyms.h:6:9: sparse: sparse: preprocessor token __KSYM_ redefined ./include/generated/autoksyms.h:5:9: sparse: this was the original definition ./include/generated/autoksyms.h:7:16: sparse: sparse: no whitespace before object-like macro body ./include/generated/autoksyms.h:7:9: sparse: sparse: preprocessor token __KSYM_ redefined ./include/generated/autoksyms.h:5:9: sparse: this was the original definition ./include/generated/autoksyms.h:8:16: sparse: sparse: no whitespace before object-like macro body ./include/generated/autoksyms.h:8:9: sparse: sparse: preprocessor token __KSYM_ redefined ./include/generated/autoksyms.h:5:9: sparse: this was the original definition ./include/generated/autoksyms.h:9:16: sparse: sparse: no whitespace before object-like macro body ./include/generated/autoksyms.h:9:9: sparse: sparse: preprocessor token __KSYM_ redefined ./include/generated/autoksyms.h:5:9: sparse: this was the original definition mm/rmap.c: note: in included file (through include/linux/ksm.h): include/linux/rmap.h:218:28: sparse: sparse: context imbalance in 'page_referenced_one' - unexpected unlock mm/rmap.c:967:25: sparse: sparse: context imbalance in 'page_mkclean_one' - different lock contexts for basic block include/linux/rmap.h:218:28: sparse: sparse: context imbalance in 'try_to_unmap_one' - unexpected unlock >> mm/rmap.c:1915:17: sparse: sparse: context imbalance in 'try_to_migrate_one' >> - different lock contexts for basic block include/linux/rmap.h:218:28: sparse: sparse: context imbalance in 'page_mlock_one' - unexpected unlock vim +/try_to_migrate_one +1915 mm/rmap.c a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1760 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1761 /* Unexpected PMD-mapped THP? */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1762 VM_BUG_ON_PAGE(!pvmw.pte, page); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1763 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1764 subpage = page - page_to_pfn(page) + pte_pfn(*pvmw.pte); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1765 address = pvmw.address; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1766 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1767 if (PageHuge(page) && !PageAnon(page)) { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1768 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1769 * To call huge_pmd_unshare, i_mmap_rwsem must be a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1770 * held in write mode. Caller needs to explicitly a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1771 * do this outside rmap routines. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1772 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1773 VM_BUG_ON(!(flags & TTU_RMAP_LOCKED)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1774 if (huge_pmd_unshare(mm, vma, &address, pvmw.pte)) { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1775 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1776 * huge_pmd_unshare unmapped an entire PMD a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1777 * page. There is no way of knowing exactly a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1778 * which PMDs may be cached for this mm, so a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1779 * we must flush them all. start/end were a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1780 * already adjusted above to cover this range. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1781 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1782 flush_cache_range(vma, range.start, range.end); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1783 flush_tlb_range(vma, range.start, range.end); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1784 mmu_notifier_invalidate_range(mm, range.start, a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1785 range.end); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1786 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1787 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1788 * The ref count of the PMD page was dropped a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1789 * which is part of the way map counting a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1790 * is done for shared PMDs. Return 'true' a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1791 * here. When there is no other sharing, a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1792 * huge_pmd_unshare returns false and we will a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1793 * unmap the actual page and drop map count a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1794 * to zero. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1795 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1796 page_vma_mapped_walk_done(&pvmw); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1797 break; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1798 } a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1799 } a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1800 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1801 /* Nuke the page table entry. */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1802 flush_cache_page(vma, address, pte_pfn(*pvmw.pte)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1803 pteval = ptep_clear_flush(vma, address, pvmw.pte); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1804 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1805 /* Move the dirty bit to the page. Now the pte is gone. */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1806 if (pte_dirty(pteval)) a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1807 set_page_dirty(page); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1808 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1809 /* Update high watermark before we lower rss */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1810 update_hiwater_rss(mm); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1811 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1812 if (is_zone_device_page(page)) { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1813 swp_entry_t entry; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1814 pte_t swp_pte; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1815 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1816 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1817 * Store the pfn of the page in a special migration a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1818 * pte. do_swap_page() will wait until the migration a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1819 * pte is removed and then restart fault handling. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1820 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1821 entry = make_readable_migration_entry( a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1822 page_to_pfn(page)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1823 swp_pte = swp_entry_to_pte(entry); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1824 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1825 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1826 * pteval maps a zone device page and is therefore a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1827 * a swap pte. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1828 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1829 if (pte_swp_soft_dirty(pteval)) a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1830 swp_pte = pte_swp_mksoft_dirty(swp_pte); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1831 if (pte_swp_uffd_wp(pteval)) a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1832 swp_pte = pte_swp_mkuffd_wp(swp_pte); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1833 set_pte_at(mm, pvmw.address, pvmw.pte, swp_pte); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1834 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1835 * No need to invalidate here it will synchronize on a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1836 * against the special swap migration pte. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1837 * a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1838 * The assignment to subpage above was computed from a a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1839 * swap PTE which results in an invalid pointer. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1840 * Since only PAGE_SIZE pages can currently be a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1841 * migrated, just set it to page. This will need to be a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1842 * changed when hugepage migrations to device private a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1843 * memory are supported. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1844 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1845 subpage = page; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1846 } else if (PageHWPoison(page)) { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1847 pteval = swp_entry_to_pte(make_hwpoison_entry(subpage)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1848 if (PageHuge(page)) { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1849 hugetlb_count_sub(compound_nr(page), mm); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1850 set_huge_swap_pte_at(mm, address, a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1851 pvmw.pte, pteval, a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1852 vma_mmu_pagesize(vma)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1853 } else { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1854 dec_mm_counter(mm, mm_counter(page)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1855 set_pte_at(mm, address, pvmw.pte, pteval); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1856 } a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1857 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1858 } else if (pte_unused(pteval) && !userfaultfd_armed(vma)) { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1859 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1860 * The guest indicated that the page content is of no a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1861 * interest anymore. Simply discard the pte, vmscan a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1862 * will take care of the rest. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1863 * A future reference will then fault in a new zero a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1864 * page. When userfaultfd is active, we must not drop a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1865 * this page though, as its main user (postcopy a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1866 * migration) will not expect userfaults on already a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1867 * copied pages. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1868 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1869 dec_mm_counter(mm, mm_counter(page)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1870 /* We have to invalidate as we cleared the pte */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1871 mmu_notifier_invalidate_range(mm, address, a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1872 address + PAGE_SIZE); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1873 } else { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1874 swp_entry_t entry; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1875 pte_t swp_pte; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1876 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1877 if (arch_unmap_one(mm, vma, address, pteval) < 0) { a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1878 set_pte_at(mm, address, pvmw.pte, pteval); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1879 ret = false; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1880 page_vma_mapped_walk_done(&pvmw); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1881 break; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1882 } a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1883 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1884 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1885 * Store the pfn of the page in a special migration a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1886 * pte. do_swap_page() will wait until the migration a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1887 * pte is removed and then restart fault handling. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1888 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1889 if (pte_write(pteval)) a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1890 entry = make_writable_migration_entry( a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1891 page_to_pfn(subpage)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1892 else a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1893 entry = make_readable_migration_entry( a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1894 page_to_pfn(subpage)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1895 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1896 swp_pte = swp_entry_to_pte(entry); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1897 if (pte_soft_dirty(pteval)) a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1898 swp_pte = pte_swp_mksoft_dirty(swp_pte); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1899 if (pte_uffd_wp(pteval)) a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1900 swp_pte = pte_swp_mkuffd_wp(swp_pte); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1901 set_pte_at(mm, address, pvmw.pte, swp_pte); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1902 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1903 * No need to invalidate here it will synchronize on a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1904 * against the special swap migration pte. a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1905 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1906 } a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1907 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1908 /* a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1909 * No need to call mmu_notifier_invalidate_range() it has be a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1910 * done above for all cases requiring it to happen under page a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1911 * table lock before mmu_notifier_invalidate_range_end() a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1912 * a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1913 * See Documentation/vm/mmu_notifier.rst a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1914 */ a98a2f0c8ce1b2 Alistair Popple 2021-06-30 @1915 page_remove_rmap(subpage, PageHuge(page)); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1916 put_page(page); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1917 } a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1918 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1919 mmu_notifier_invalidate_range_end(&range); a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1920 a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1921 return ret; a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1922 } a98a2f0c8ce1b2 Alistair Popple 2021-06-30 1923 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
