From: kernel test robot <lkp@intel.com>
To: Baolin Wang <baolin.wang@linux.alibaba.com>,
akpm@linux-foundation.org, mike.kravetz@oracle.com,
catalin.marinas@arm.com, will@kernel.org
Cc: llvm@lists.linux.dev, kbuild-all@lists.01.org,
tsbogend@alpha.franken.de, James.Bottomley@hansenpartnership.com,
deller@gmx.de, mpe@ellerman.id.au, benh@kernel.crashing.org,
paulus@samba.org, hca@linux.ibm.com, gor@linux.ibm.com,
agordeev@linux.ibm.com, borntraeger@linux.ibm.com,
svens@linux.ibm.com, ysato@users.sourceforge.jp, dalias@libc.org,
davem@davemloft.net, arnd@arndb.de,
baolin.wang@linux.alibaba.com,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-ia64@vger.kernel.org,
linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org,
linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org,
linux-sh@vger.kernel.org, sparclinux@vger.kernel.org,
linux-arch@vger.kernel.org
Subject: Re: [PATCH v2 2/3] mm: rmap: Fix CONT-PTE/PMD size hugetlb issue when migration
Date: Sun, 8 May 2022 20:11:24 +0800 [thread overview]
Message-ID: <202205081950.IpKFNYip-lkp@intel.com> (raw)
In-Reply-To: <1ec8a987be1a5400e077260a300d0079564b1472.1652002221.git.baolin.wang@linux.alibaba.com>
Hi Baolin,
I love your patch! Yet something to improve:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20220506]
[cannot apply to hnaz-mm/master arm64/for-next/core linus/master v5.18-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/Fix-CONT-PTE-PMD-size-hugetlb-issue-when-unmapping-or-migrating/20220508-174036
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
config: x86_64-randconfig-a014 (https://download.01.org/0day-ci/archive/20220508/202205081950.IpKFNYip-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a385645b470e2d3a1534aae618ea56b31177639f)
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
# https://github.com/intel-lab-lkp/linux/commit/907981b27213707fdb2f8a24c107d6752a09a773
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Baolin-Wang/Fix-CONT-PTE-PMD-size-hugetlb-issue-when-unmapping-or-migrating/20220508-174036
git checkout 907981b27213707fdb2f8a24c107d6752a09a773
# 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=x86_64 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> mm/rmap.c:1931:13: error: call to undeclared function 'huge_ptep_clear_flush'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
^
mm/rmap.c:1931:13: note: did you mean 'ptep_clear_flush'?
include/linux/pgtable.h:431:14: note: 'ptep_clear_flush' declared here
extern pte_t ptep_clear_flush(struct vm_area_struct *vma,
^
>> mm/rmap.c:1931:11: error: assigning to 'pte_t' from incompatible type 'int'
pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> mm/rmap.c:2023:6: error: call to undeclared function 'set_huge_pte_at'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
set_huge_pte_at(mm, address, pvmw.pte, pteval);
^
mm/rmap.c:2035:6: error: call to undeclared function 'set_huge_pte_at'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
set_huge_pte_at(mm, address, pvmw.pte, pteval);
^
4 errors generated.
vim +/huge_ptep_clear_flush +1931 mm/rmap.c
1883
1884 /* Unexpected PMD-mapped THP? */
1885 VM_BUG_ON_FOLIO(!pvmw.pte, folio);
1886
1887 subpage = folio_page(folio,
1888 pte_pfn(*pvmw.pte) - folio_pfn(folio));
1889 address = pvmw.address;
1890 anon_exclusive = folio_test_anon(folio) &&
1891 PageAnonExclusive(subpage);
1892
1893 if (folio_test_hugetlb(folio)) {
1894 /*
1895 * huge_pmd_unshare may unmap an entire PMD page.
1896 * There is no way of knowing exactly which PMDs may
1897 * be cached for this mm, so we must flush them all.
1898 * start/end were already adjusted above to cover this
1899 * range.
1900 */
1901 flush_cache_range(vma, range.start, range.end);
1902
1903 if (!folio_test_anon(folio)) {
1904 /*
1905 * To call huge_pmd_unshare, i_mmap_rwsem must be
1906 * held in write mode. Caller needs to explicitly
1907 * do this outside rmap routines.
1908 */
1909 VM_BUG_ON(!(flags & TTU_RMAP_LOCKED));
1910
1911 if (huge_pmd_unshare(mm, vma, &address, pvmw.pte)) {
1912 flush_tlb_range(vma, range.start, range.end);
1913 mmu_notifier_invalidate_range(mm, range.start,
1914 range.end);
1915
1916 /*
1917 * The ref count of the PMD page was dropped
1918 * which is part of the way map counting
1919 * is done for shared PMDs. Return 'true'
1920 * here. When there is no other sharing,
1921 * huge_pmd_unshare returns false and we will
1922 * unmap the actual page and drop map count
1923 * to zero.
1924 */
1925 page_vma_mapped_walk_done(&pvmw);
1926 break;
1927 }
1928 }
1929
1930 /* Nuke the hugetlb page table entry */
> 1931 pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
1932 } else {
1933 flush_cache_page(vma, address, pte_pfn(*pvmw.pte));
1934 /* Nuke the page table entry. */
1935 pteval = ptep_clear_flush(vma, address, pvmw.pte);
1936 }
1937
1938 /* Set the dirty flag on the folio now the pte is gone. */
1939 if (pte_dirty(pteval))
1940 folio_mark_dirty(folio);
1941
1942 /* Update high watermark before we lower rss */
1943 update_hiwater_rss(mm);
1944
1945 if (folio_is_zone_device(folio)) {
1946 unsigned long pfn = folio_pfn(folio);
1947 swp_entry_t entry;
1948 pte_t swp_pte;
1949
1950 if (anon_exclusive)
1951 BUG_ON(page_try_share_anon_rmap(subpage));
1952
1953 /*
1954 * Store the pfn of the page in a special migration
1955 * pte. do_swap_page() will wait until the migration
1956 * pte is removed and then restart fault handling.
1957 */
1958 entry = pte_to_swp_entry(pteval);
1959 if (is_writable_device_private_entry(entry))
1960 entry = make_writable_migration_entry(pfn);
1961 else if (anon_exclusive)
1962 entry = make_readable_exclusive_migration_entry(pfn);
1963 else
1964 entry = make_readable_migration_entry(pfn);
1965 swp_pte = swp_entry_to_pte(entry);
1966
1967 /*
1968 * pteval maps a zone device page and is therefore
1969 * a swap pte.
1970 */
1971 if (pte_swp_soft_dirty(pteval))
1972 swp_pte = pte_swp_mksoft_dirty(swp_pte);
1973 if (pte_swp_uffd_wp(pteval))
1974 swp_pte = pte_swp_mkuffd_wp(swp_pte);
1975 set_pte_at(mm, pvmw.address, pvmw.pte, swp_pte);
1976 trace_set_migration_pte(pvmw.address, pte_val(swp_pte),
1977 compound_order(&folio->page));
1978 /*
1979 * No need to invalidate here it will synchronize on
1980 * against the special swap migration pte.
1981 *
1982 * The assignment to subpage above was computed from a
1983 * swap PTE which results in an invalid pointer.
1984 * Since only PAGE_SIZE pages can currently be
1985 * migrated, just set it to page. This will need to be
1986 * changed when hugepage migrations to device private
1987 * memory are supported.
1988 */
1989 subpage = &folio->page;
1990 } else if (PageHWPoison(subpage)) {
1991 pteval = swp_entry_to_pte(make_hwpoison_entry(subpage));
1992 if (folio_test_hugetlb(folio)) {
1993 hugetlb_count_sub(folio_nr_pages(folio), mm);
1994 set_huge_swap_pte_at(mm, address,
1995 pvmw.pte, pteval,
1996 vma_mmu_pagesize(vma));
1997 } else {
1998 dec_mm_counter(mm, mm_counter(&folio->page));
1999 set_pte_at(mm, address, pvmw.pte, pteval);
2000 }
2001
2002 } else if (pte_unused(pteval) && !userfaultfd_armed(vma)) {
2003 /*
2004 * The guest indicated that the page content is of no
2005 * interest anymore. Simply discard the pte, vmscan
2006 * will take care of the rest.
2007 * A future reference will then fault in a new zero
2008 * page. When userfaultfd is active, we must not drop
2009 * this page though, as its main user (postcopy
2010 * migration) will not expect userfaults on already
2011 * copied pages.
2012 */
2013 dec_mm_counter(mm, mm_counter(&folio->page));
2014 /* We have to invalidate as we cleared the pte */
2015 mmu_notifier_invalidate_range(mm, address,
2016 address + PAGE_SIZE);
2017 } else {
2018 swp_entry_t entry;
2019 pte_t swp_pte;
2020
2021 if (arch_unmap_one(mm, vma, address, pteval) < 0) {
2022 if (folio_test_hugetlb(folio))
> 2023 set_huge_pte_at(mm, address, pvmw.pte, pteval);
2024 else
2025 set_pte_at(mm, address, pvmw.pte, pteval);
2026 ret = false;
2027 page_vma_mapped_walk_done(&pvmw);
2028 break;
2029 }
2030 VM_BUG_ON_PAGE(pte_write(pteval) && folio_test_anon(folio) &&
2031 !anon_exclusive, subpage);
2032 if (anon_exclusive &&
2033 page_try_share_anon_rmap(subpage)) {
2034 if (folio_test_hugetlb(folio))
2035 set_huge_pte_at(mm, address, pvmw.pte, pteval);
2036 else
2037 set_pte_at(mm, address, pvmw.pte, pteval);
2038 ret = false;
2039 page_vma_mapped_walk_done(&pvmw);
2040 break;
2041 }
2042
2043 /*
2044 * Store the pfn of the page in a special migration
2045 * pte. do_swap_page() will wait until the migration
2046 * pte is removed and then restart fault handling.
2047 */
2048 if (pte_write(pteval))
2049 entry = make_writable_migration_entry(
2050 page_to_pfn(subpage));
2051 else if (anon_exclusive)
2052 entry = make_readable_exclusive_migration_entry(
2053 page_to_pfn(subpage));
2054 else
2055 entry = make_readable_migration_entry(
2056 page_to_pfn(subpage));
2057
2058 swp_pte = swp_entry_to_pte(entry);
2059 if (pte_soft_dirty(pteval))
2060 swp_pte = pte_swp_mksoft_dirty(swp_pte);
2061 if (pte_uffd_wp(pteval))
2062 swp_pte = pte_swp_mkuffd_wp(swp_pte);
2063 if (folio_test_hugetlb(folio))
2064 set_huge_swap_pte_at(mm, address, pvmw.pte,
2065 swp_pte, vma_mmu_pagesize(vma));
2066 else
2067 set_pte_at(mm, address, pvmw.pte, swp_pte);
2068 trace_set_migration_pte(address, pte_val(swp_pte),
2069 compound_order(&folio->page));
2070 /*
2071 * No need to invalidate here it will synchronize on
2072 * against the special swap migration pte.
2073 */
2074 }
2075
2076 /*
2077 * No need to call mmu_notifier_invalidate_range() it has be
2078 * done above for all cases requiring it to happen under page
2079 * table lock before mmu_notifier_invalidate_range_end()
2080 *
2081 * See Documentation/vm/mmu_notifier.rst
2082 */
2083 page_remove_rmap(subpage, vma, folio_test_hugetlb(folio));
2084 if (vma->vm_flags & VM_LOCKED)
2085 mlock_page_drain_local();
2086 folio_put(folio);
2087 }
2088
2089 mmu_notifier_invalidate_range_end(&range);
2090
2091 return ret;
2092 }
2093
--
0-DAY CI Kernel Test Service
https://01.org/lkp
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Baolin Wang <baolin.wang@linux.alibaba.com>,
akpm@linux-foundation.org, mike.kravetz@oracle.com,
catalin.marinas@arm.com, will@kernel.org
Cc: llvm@lists.linux.dev, kbuild-all@lists.01.org,
tsbogend@alpha.franken.de, James.Bottomley@hansenpartnership.com,
deller@gmx.de, mpe@ellerman.id.au, benh@kernel.crashing.org,
paulus@samba.org, hca@linux.ibm.com, gor@linux.ibm.com,
agordeev@linux.ibm.com, borntraeger@linux.ibm.com,
svens@linux.ibm.com, ysato@users.sourceforge.jp, dalias@libc.org,
davem@davemloft.net, arnd@arndb.de,
baolin.wang@linux.alibaba.com,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-ia64@vger.kernel.org,
linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org,
linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org,
linux-sh@vger.kernel.org, sparclinux@vger.kernel.org,
linux-arch@vger.kernel.org
Subject: Re: [PATCH v2 2/3] mm: rmap: Fix CONT-PTE/PMD size hugetlb issue when migration
Date: Sun, 08 May 2022 12:11:24 +0000 [thread overview]
Message-ID: <202205081950.IpKFNYip-lkp@intel.com> (raw)
In-Reply-To: <1ec8a987be1a5400e077260a300d0079564b1472.1652002221.git.baolin.wang@linux.alibaba.com>
Hi Baolin,
I love your patch! Yet something to improve:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20220506]
[cannot apply to hnaz-mm/master arm64/for-next/core linus/master v5.18-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/Fix-CONT-PTE-PMD-size-hugetlb-issue-when-unmapping-or-migrating/20220508-174036
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
config: x86_64-randconfig-a014 (https://download.01.org/0day-ci/archive/20220508/202205081950.IpKFNYip-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a385645b470e2d3a1534aae618ea56b31177639f)
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
# https://github.com/intel-lab-lkp/linux/commit/907981b27213707fdb2f8a24c107d6752a09a773
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Baolin-Wang/Fix-CONT-PTE-PMD-size-hugetlb-issue-when-unmapping-or-migrating/20220508-174036
git checkout 907981b27213707fdb2f8a24c107d6752a09a773
# 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=x86_64 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> mm/rmap.c:1931:13: error: call to undeclared function 'huge_ptep_clear_flush'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
^
mm/rmap.c:1931:13: note: did you mean 'ptep_clear_flush'?
include/linux/pgtable.h:431:14: note: 'ptep_clear_flush' declared here
extern pte_t ptep_clear_flush(struct vm_area_struct *vma,
^
>> mm/rmap.c:1931:11: error: assigning to 'pte_t' from incompatible type 'int'
pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> mm/rmap.c:2023:6: error: call to undeclared function 'set_huge_pte_at'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
set_huge_pte_at(mm, address, pvmw.pte, pteval);
^
mm/rmap.c:2035:6: error: call to undeclared function 'set_huge_pte_at'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
set_huge_pte_at(mm, address, pvmw.pte, pteval);
^
4 errors generated.
vim +/huge_ptep_clear_flush +1931 mm/rmap.c
1883
1884 /* Unexpected PMD-mapped THP? */
1885 VM_BUG_ON_FOLIO(!pvmw.pte, folio);
1886
1887 subpage = folio_page(folio,
1888 pte_pfn(*pvmw.pte) - folio_pfn(folio));
1889 address = pvmw.address;
1890 anon_exclusive = folio_test_anon(folio) &&
1891 PageAnonExclusive(subpage);
1892
1893 if (folio_test_hugetlb(folio)) {
1894 /*
1895 * huge_pmd_unshare may unmap an entire PMD page.
1896 * There is no way of knowing exactly which PMDs may
1897 * be cached for this mm, so we must flush them all.
1898 * start/end were already adjusted above to cover this
1899 * range.
1900 */
1901 flush_cache_range(vma, range.start, range.end);
1902
1903 if (!folio_test_anon(folio)) {
1904 /*
1905 * To call huge_pmd_unshare, i_mmap_rwsem must be
1906 * held in write mode. Caller needs to explicitly
1907 * do this outside rmap routines.
1908 */
1909 VM_BUG_ON(!(flags & TTU_RMAP_LOCKED));
1910
1911 if (huge_pmd_unshare(mm, vma, &address, pvmw.pte)) {
1912 flush_tlb_range(vma, range.start, range.end);
1913 mmu_notifier_invalidate_range(mm, range.start,
1914 range.end);
1915
1916 /*
1917 * The ref count of the PMD page was dropped
1918 * which is part of the way map counting
1919 * is done for shared PMDs. Return 'true'
1920 * here. When there is no other sharing,
1921 * huge_pmd_unshare returns false and we will
1922 * unmap the actual page and drop map count
1923 * to zero.
1924 */
1925 page_vma_mapped_walk_done(&pvmw);
1926 break;
1927 }
1928 }
1929
1930 /* Nuke the hugetlb page table entry */
> 1931 pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
1932 } else {
1933 flush_cache_page(vma, address, pte_pfn(*pvmw.pte));
1934 /* Nuke the page table entry. */
1935 pteval = ptep_clear_flush(vma, address, pvmw.pte);
1936 }
1937
1938 /* Set the dirty flag on the folio now the pte is gone. */
1939 if (pte_dirty(pteval))
1940 folio_mark_dirty(folio);
1941
1942 /* Update high watermark before we lower rss */
1943 update_hiwater_rss(mm);
1944
1945 if (folio_is_zone_device(folio)) {
1946 unsigned long pfn = folio_pfn(folio);
1947 swp_entry_t entry;
1948 pte_t swp_pte;
1949
1950 if (anon_exclusive)
1951 BUG_ON(page_try_share_anon_rmap(subpage));
1952
1953 /*
1954 * Store the pfn of the page in a special migration
1955 * pte. do_swap_page() will wait until the migration
1956 * pte is removed and then restart fault handling.
1957 */
1958 entry = pte_to_swp_entry(pteval);
1959 if (is_writable_device_private_entry(entry))
1960 entry = make_writable_migration_entry(pfn);
1961 else if (anon_exclusive)
1962 entry = make_readable_exclusive_migration_entry(pfn);
1963 else
1964 entry = make_readable_migration_entry(pfn);
1965 swp_pte = swp_entry_to_pte(entry);
1966
1967 /*
1968 * pteval maps a zone device page and is therefore
1969 * a swap pte.
1970 */
1971 if (pte_swp_soft_dirty(pteval))
1972 swp_pte = pte_swp_mksoft_dirty(swp_pte);
1973 if (pte_swp_uffd_wp(pteval))
1974 swp_pte = pte_swp_mkuffd_wp(swp_pte);
1975 set_pte_at(mm, pvmw.address, pvmw.pte, swp_pte);
1976 trace_set_migration_pte(pvmw.address, pte_val(swp_pte),
1977 compound_order(&folio->page));
1978 /*
1979 * No need to invalidate here it will synchronize on
1980 * against the special swap migration pte.
1981 *
1982 * The assignment to subpage above was computed from a
1983 * swap PTE which results in an invalid pointer.
1984 * Since only PAGE_SIZE pages can currently be
1985 * migrated, just set it to page. This will need to be
1986 * changed when hugepage migrations to device private
1987 * memory are supported.
1988 */
1989 subpage = &folio->page;
1990 } else if (PageHWPoison(subpage)) {
1991 pteval = swp_entry_to_pte(make_hwpoison_entry(subpage));
1992 if (folio_test_hugetlb(folio)) {
1993 hugetlb_count_sub(folio_nr_pages(folio), mm);
1994 set_huge_swap_pte_at(mm, address,
1995 pvmw.pte, pteval,
1996 vma_mmu_pagesize(vma));
1997 } else {
1998 dec_mm_counter(mm, mm_counter(&folio->page));
1999 set_pte_at(mm, address, pvmw.pte, pteval);
2000 }
2001
2002 } else if (pte_unused(pteval) && !userfaultfd_armed(vma)) {
2003 /*
2004 * The guest indicated that the page content is of no
2005 * interest anymore. Simply discard the pte, vmscan
2006 * will take care of the rest.
2007 * A future reference will then fault in a new zero
2008 * page. When userfaultfd is active, we must not drop
2009 * this page though, as its main user (postcopy
2010 * migration) will not expect userfaults on already
2011 * copied pages.
2012 */
2013 dec_mm_counter(mm, mm_counter(&folio->page));
2014 /* We have to invalidate as we cleared the pte */
2015 mmu_notifier_invalidate_range(mm, address,
2016 address + PAGE_SIZE);
2017 } else {
2018 swp_entry_t entry;
2019 pte_t swp_pte;
2020
2021 if (arch_unmap_one(mm, vma, address, pteval) < 0) {
2022 if (folio_test_hugetlb(folio))
> 2023 set_huge_pte_at(mm, address, pvmw.pte, pteval);
2024 else
2025 set_pte_at(mm, address, pvmw.pte, pteval);
2026 ret = false;
2027 page_vma_mapped_walk_done(&pvmw);
2028 break;
2029 }
2030 VM_BUG_ON_PAGE(pte_write(pteval) && folio_test_anon(folio) &&
2031 !anon_exclusive, subpage);
2032 if (anon_exclusive &&
2033 page_try_share_anon_rmap(subpage)) {
2034 if (folio_test_hugetlb(folio))
2035 set_huge_pte_at(mm, address, pvmw.pte, pteval);
2036 else
2037 set_pte_at(mm, address, pvmw.pte, pteval);
2038 ret = false;
2039 page_vma_mapped_walk_done(&pvmw);
2040 break;
2041 }
2042
2043 /*
2044 * Store the pfn of the page in a special migration
2045 * pte. do_swap_page() will wait until the migration
2046 * pte is removed and then restart fault handling.
2047 */
2048 if (pte_write(pteval))
2049 entry = make_writable_migration_entry(
2050 page_to_pfn(subpage));
2051 else if (anon_exclusive)
2052 entry = make_readable_exclusive_migration_entry(
2053 page_to_pfn(subpage));
2054 else
2055 entry = make_readable_migration_entry(
2056 page_to_pfn(subpage));
2057
2058 swp_pte = swp_entry_to_pte(entry);
2059 if (pte_soft_dirty(pteval))
2060 swp_pte = pte_swp_mksoft_dirty(swp_pte);
2061 if (pte_uffd_wp(pteval))
2062 swp_pte = pte_swp_mkuffd_wp(swp_pte);
2063 if (folio_test_hugetlb(folio))
2064 set_huge_swap_pte_at(mm, address, pvmw.pte,
2065 swp_pte, vma_mmu_pagesize(vma));
2066 else
2067 set_pte_at(mm, address, pvmw.pte, swp_pte);
2068 trace_set_migration_pte(address, pte_val(swp_pte),
2069 compound_order(&folio->page));
2070 /*
2071 * No need to invalidate here it will synchronize on
2072 * against the special swap migration pte.
2073 */
2074 }
2075
2076 /*
2077 * No need to call mmu_notifier_invalidate_range() it has be
2078 * done above for all cases requiring it to happen under page
2079 * table lock before mmu_notifier_invalidate_range_end()
2080 *
2081 * See Documentation/vm/mmu_notifier.rst
2082 */
2083 page_remove_rmap(subpage, vma, folio_test_hugetlb(folio));
2084 if (vma->vm_flags & VM_LOCKED)
2085 mlock_page_drain_local();
2086 folio_put(folio);
2087 }
2088
2089 mmu_notifier_invalidate_range_end(&range);
2090
2091 return ret;
2092 }
2093
--
0-DAY CI Kernel Test Service
https://01.org/lkp
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Baolin Wang <baolin.wang@linux.alibaba.com>,
akpm@linux-foundation.org, mike.kravetz@oracle.com,
catalin.marinas@arm.com, will@kernel.org
Cc: dalias@libc.org, linux-ia64@vger.kernel.org,
linux-sh@vger.kernel.org, llvm@lists.linux.dev,
linux-kernel@vger.kernel.org,
James.Bottomley@hansenpartnership.com, paulus@samba.org,
sparclinux@vger.kernel.org, agordeev@linux.ibm.com,
linux-arch@vger.kernel.org, linux-s390@vger.kernel.org,
arnd@arndb.de, ysato@users.sourceforge.jp, deller@gmx.de,
borntraeger@linux.ibm.com, gor@linux.ibm.com, hca@linux.ibm.com,
baolin.wang@linux.alibaba.com,
linux-arm-kernel@lists.infradead.org, tsbogend@alpha.franken.de,
kbuild-all@lists.01.org, linux-parisc@vger.kernel.org,
linux-mips@vger.kernel.org, svens@linux.ibm.com,
linuxppc-dev@lists.ozlabs.org, davem@davemloft.net
Subject: Re: [PATCH v2 2/3] mm: rmap: Fix CONT-PTE/PMD size hugetlb issue when migration
Date: Sun, 8 May 2022 20:11:24 +0800 [thread overview]
Message-ID: <202205081950.IpKFNYip-lkp@intel.com> (raw)
In-Reply-To: <1ec8a987be1a5400e077260a300d0079564b1472.1652002221.git.baolin.wang@linux.alibaba.com>
Hi Baolin,
I love your patch! Yet something to improve:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20220506]
[cannot apply to hnaz-mm/master arm64/for-next/core linus/master v5.18-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/Fix-CONT-PTE-PMD-size-hugetlb-issue-when-unmapping-or-migrating/20220508-174036
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
config: x86_64-randconfig-a014 (https://download.01.org/0day-ci/archive/20220508/202205081950.IpKFNYip-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a385645b470e2d3a1534aae618ea56b31177639f)
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
# https://github.com/intel-lab-lkp/linux/commit/907981b27213707fdb2f8a24c107d6752a09a773
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Baolin-Wang/Fix-CONT-PTE-PMD-size-hugetlb-issue-when-unmapping-or-migrating/20220508-174036
git checkout 907981b27213707fdb2f8a24c107d6752a09a773
# 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=x86_64 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> mm/rmap.c:1931:13: error: call to undeclared function 'huge_ptep_clear_flush'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
^
mm/rmap.c:1931:13: note: did you mean 'ptep_clear_flush'?
include/linux/pgtable.h:431:14: note: 'ptep_clear_flush' declared here
extern pte_t ptep_clear_flush(struct vm_area_struct *vma,
^
>> mm/rmap.c:1931:11: error: assigning to 'pte_t' from incompatible type 'int'
pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> mm/rmap.c:2023:6: error: call to undeclared function 'set_huge_pte_at'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
set_huge_pte_at(mm, address, pvmw.pte, pteval);
^
mm/rmap.c:2035:6: error: call to undeclared function 'set_huge_pte_at'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
set_huge_pte_at(mm, address, pvmw.pte, pteval);
^
4 errors generated.
vim +/huge_ptep_clear_flush +1931 mm/rmap.c
1883
1884 /* Unexpected PMD-mapped THP? */
1885 VM_BUG_ON_FOLIO(!pvmw.pte, folio);
1886
1887 subpage = folio_page(folio,
1888 pte_pfn(*pvmw.pte) - folio_pfn(folio));
1889 address = pvmw.address;
1890 anon_exclusive = folio_test_anon(folio) &&
1891 PageAnonExclusive(subpage);
1892
1893 if (folio_test_hugetlb(folio)) {
1894 /*
1895 * huge_pmd_unshare may unmap an entire PMD page.
1896 * There is no way of knowing exactly which PMDs may
1897 * be cached for this mm, so we must flush them all.
1898 * start/end were already adjusted above to cover this
1899 * range.
1900 */
1901 flush_cache_range(vma, range.start, range.end);
1902
1903 if (!folio_test_anon(folio)) {
1904 /*
1905 * To call huge_pmd_unshare, i_mmap_rwsem must be
1906 * held in write mode. Caller needs to explicitly
1907 * do this outside rmap routines.
1908 */
1909 VM_BUG_ON(!(flags & TTU_RMAP_LOCKED));
1910
1911 if (huge_pmd_unshare(mm, vma, &address, pvmw.pte)) {
1912 flush_tlb_range(vma, range.start, range.end);
1913 mmu_notifier_invalidate_range(mm, range.start,
1914 range.end);
1915
1916 /*
1917 * The ref count of the PMD page was dropped
1918 * which is part of the way map counting
1919 * is done for shared PMDs. Return 'true'
1920 * here. When there is no other sharing,
1921 * huge_pmd_unshare returns false and we will
1922 * unmap the actual page and drop map count
1923 * to zero.
1924 */
1925 page_vma_mapped_walk_done(&pvmw);
1926 break;
1927 }
1928 }
1929
1930 /* Nuke the hugetlb page table entry */
> 1931 pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
1932 } else {
1933 flush_cache_page(vma, address, pte_pfn(*pvmw.pte));
1934 /* Nuke the page table entry. */
1935 pteval = ptep_clear_flush(vma, address, pvmw.pte);
1936 }
1937
1938 /* Set the dirty flag on the folio now the pte is gone. */
1939 if (pte_dirty(pteval))
1940 folio_mark_dirty(folio);
1941
1942 /* Update high watermark before we lower rss */
1943 update_hiwater_rss(mm);
1944
1945 if (folio_is_zone_device(folio)) {
1946 unsigned long pfn = folio_pfn(folio);
1947 swp_entry_t entry;
1948 pte_t swp_pte;
1949
1950 if (anon_exclusive)
1951 BUG_ON(page_try_share_anon_rmap(subpage));
1952
1953 /*
1954 * Store the pfn of the page in a special migration
1955 * pte. do_swap_page() will wait until the migration
1956 * pte is removed and then restart fault handling.
1957 */
1958 entry = pte_to_swp_entry(pteval);
1959 if (is_writable_device_private_entry(entry))
1960 entry = make_writable_migration_entry(pfn);
1961 else if (anon_exclusive)
1962 entry = make_readable_exclusive_migration_entry(pfn);
1963 else
1964 entry = make_readable_migration_entry(pfn);
1965 swp_pte = swp_entry_to_pte(entry);
1966
1967 /*
1968 * pteval maps a zone device page and is therefore
1969 * a swap pte.
1970 */
1971 if (pte_swp_soft_dirty(pteval))
1972 swp_pte = pte_swp_mksoft_dirty(swp_pte);
1973 if (pte_swp_uffd_wp(pteval))
1974 swp_pte = pte_swp_mkuffd_wp(swp_pte);
1975 set_pte_at(mm, pvmw.address, pvmw.pte, swp_pte);
1976 trace_set_migration_pte(pvmw.address, pte_val(swp_pte),
1977 compound_order(&folio->page));
1978 /*
1979 * No need to invalidate here it will synchronize on
1980 * against the special swap migration pte.
1981 *
1982 * The assignment to subpage above was computed from a
1983 * swap PTE which results in an invalid pointer.
1984 * Since only PAGE_SIZE pages can currently be
1985 * migrated, just set it to page. This will need to be
1986 * changed when hugepage migrations to device private
1987 * memory are supported.
1988 */
1989 subpage = &folio->page;
1990 } else if (PageHWPoison(subpage)) {
1991 pteval = swp_entry_to_pte(make_hwpoison_entry(subpage));
1992 if (folio_test_hugetlb(folio)) {
1993 hugetlb_count_sub(folio_nr_pages(folio), mm);
1994 set_huge_swap_pte_at(mm, address,
1995 pvmw.pte, pteval,
1996 vma_mmu_pagesize(vma));
1997 } else {
1998 dec_mm_counter(mm, mm_counter(&folio->page));
1999 set_pte_at(mm, address, pvmw.pte, pteval);
2000 }
2001
2002 } else if (pte_unused(pteval) && !userfaultfd_armed(vma)) {
2003 /*
2004 * The guest indicated that the page content is of no
2005 * interest anymore. Simply discard the pte, vmscan
2006 * will take care of the rest.
2007 * A future reference will then fault in a new zero
2008 * page. When userfaultfd is active, we must not drop
2009 * this page though, as its main user (postcopy
2010 * migration) will not expect userfaults on already
2011 * copied pages.
2012 */
2013 dec_mm_counter(mm, mm_counter(&folio->page));
2014 /* We have to invalidate as we cleared the pte */
2015 mmu_notifier_invalidate_range(mm, address,
2016 address + PAGE_SIZE);
2017 } else {
2018 swp_entry_t entry;
2019 pte_t swp_pte;
2020
2021 if (arch_unmap_one(mm, vma, address, pteval) < 0) {
2022 if (folio_test_hugetlb(folio))
> 2023 set_huge_pte_at(mm, address, pvmw.pte, pteval);
2024 else
2025 set_pte_at(mm, address, pvmw.pte, pteval);
2026 ret = false;
2027 page_vma_mapped_walk_done(&pvmw);
2028 break;
2029 }
2030 VM_BUG_ON_PAGE(pte_write(pteval) && folio_test_anon(folio) &&
2031 !anon_exclusive, subpage);
2032 if (anon_exclusive &&
2033 page_try_share_anon_rmap(subpage)) {
2034 if (folio_test_hugetlb(folio))
2035 set_huge_pte_at(mm, address, pvmw.pte, pteval);
2036 else
2037 set_pte_at(mm, address, pvmw.pte, pteval);
2038 ret = false;
2039 page_vma_mapped_walk_done(&pvmw);
2040 break;
2041 }
2042
2043 /*
2044 * Store the pfn of the page in a special migration
2045 * pte. do_swap_page() will wait until the migration
2046 * pte is removed and then restart fault handling.
2047 */
2048 if (pte_write(pteval))
2049 entry = make_writable_migration_entry(
2050 page_to_pfn(subpage));
2051 else if (anon_exclusive)
2052 entry = make_readable_exclusive_migration_entry(
2053 page_to_pfn(subpage));
2054 else
2055 entry = make_readable_migration_entry(
2056 page_to_pfn(subpage));
2057
2058 swp_pte = swp_entry_to_pte(entry);
2059 if (pte_soft_dirty(pteval))
2060 swp_pte = pte_swp_mksoft_dirty(swp_pte);
2061 if (pte_uffd_wp(pteval))
2062 swp_pte = pte_swp_mkuffd_wp(swp_pte);
2063 if (folio_test_hugetlb(folio))
2064 set_huge_swap_pte_at(mm, address, pvmw.pte,
2065 swp_pte, vma_mmu_pagesize(vma));
2066 else
2067 set_pte_at(mm, address, pvmw.pte, swp_pte);
2068 trace_set_migration_pte(address, pte_val(swp_pte),
2069 compound_order(&folio->page));
2070 /*
2071 * No need to invalidate here it will synchronize on
2072 * against the special swap migration pte.
2073 */
2074 }
2075
2076 /*
2077 * No need to call mmu_notifier_invalidate_range() it has be
2078 * done above for all cases requiring it to happen under page
2079 * table lock before mmu_notifier_invalidate_range_end()
2080 *
2081 * See Documentation/vm/mmu_notifier.rst
2082 */
2083 page_remove_rmap(subpage, vma, folio_test_hugetlb(folio));
2084 if (vma->vm_flags & VM_LOCKED)
2085 mlock_page_drain_local();
2086 folio_put(folio);
2087 }
2088
2089 mmu_notifier_invalidate_range_end(&range);
2090
2091 return ret;
2092 }
2093
--
0-DAY CI Kernel Test Service
https://01.org/lkp
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Baolin Wang <baolin.wang@linux.alibaba.com>,
akpm@linux-foundation.org, mike.kravetz@oracle.com,
catalin.marinas@arm.com, will@kernel.org
Cc: llvm@lists.linux.dev, kbuild-all@lists.01.org,
tsbogend@alpha.franken.de, James.Bottomley@hansenpartnership.com,
deller@gmx.de, mpe@ellerman.id.au, benh@kernel.crashing.org,
paulus@samba.org, hca@linux.ibm.com, gor@linux.ibm.com,
agordeev@linux.ibm.com, borntraeger@linux.ibm.com,
svens@linux.ibm.com, ysato@users.sourceforge.jp, dalias@libc.org,
davem@davemloft.net, arnd@arndb.de,
baolin.wang@linux.alibaba.com,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-ia64@vger.kernel.org,
linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org,
linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org,
linux-sh@vger.kernel.org, sparclinux@vger.kernel.org,
linux-arch@vger.kernel.org
Subject: Re: [PATCH v2 2/3] mm: rmap: Fix CONT-PTE/PMD size hugetlb issue when migration
Date: Sun, 8 May 2022 20:11:24 +0800 [thread overview]
Message-ID: <202205081950.IpKFNYip-lkp@intel.com> (raw)
In-Reply-To: <1ec8a987be1a5400e077260a300d0079564b1472.1652002221.git.baolin.wang@linux.alibaba.com>
Hi Baolin,
I love your patch! Yet something to improve:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20220506]
[cannot apply to hnaz-mm/master arm64/for-next/core linus/master v5.18-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/Fix-CONT-PTE-PMD-size-hugetlb-issue-when-unmapping-or-migrating/20220508-174036
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
config: x86_64-randconfig-a014 (https://download.01.org/0day-ci/archive/20220508/202205081950.IpKFNYip-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a385645b470e2d3a1534aae618ea56b31177639f)
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
# https://github.com/intel-lab-lkp/linux/commit/907981b27213707fdb2f8a24c107d6752a09a773
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Baolin-Wang/Fix-CONT-PTE-PMD-size-hugetlb-issue-when-unmapping-or-migrating/20220508-174036
git checkout 907981b27213707fdb2f8a24c107d6752a09a773
# 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=x86_64 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> mm/rmap.c:1931:13: error: call to undeclared function 'huge_ptep_clear_flush'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
^
mm/rmap.c:1931:13: note: did you mean 'ptep_clear_flush'?
include/linux/pgtable.h:431:14: note: 'ptep_clear_flush' declared here
extern pte_t ptep_clear_flush(struct vm_area_struct *vma,
^
>> mm/rmap.c:1931:11: error: assigning to 'pte_t' from incompatible type 'int'
pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> mm/rmap.c:2023:6: error: call to undeclared function 'set_huge_pte_at'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
set_huge_pte_at(mm, address, pvmw.pte, pteval);
^
mm/rmap.c:2035:6: error: call to undeclared function 'set_huge_pte_at'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
set_huge_pte_at(mm, address, pvmw.pte, pteval);
^
4 errors generated.
vim +/huge_ptep_clear_flush +1931 mm/rmap.c
1883
1884 /* Unexpected PMD-mapped THP? */
1885 VM_BUG_ON_FOLIO(!pvmw.pte, folio);
1886
1887 subpage = folio_page(folio,
1888 pte_pfn(*pvmw.pte) - folio_pfn(folio));
1889 address = pvmw.address;
1890 anon_exclusive = folio_test_anon(folio) &&
1891 PageAnonExclusive(subpage);
1892
1893 if (folio_test_hugetlb(folio)) {
1894 /*
1895 * huge_pmd_unshare may unmap an entire PMD page.
1896 * There is no way of knowing exactly which PMDs may
1897 * be cached for this mm, so we must flush them all.
1898 * start/end were already adjusted above to cover this
1899 * range.
1900 */
1901 flush_cache_range(vma, range.start, range.end);
1902
1903 if (!folio_test_anon(folio)) {
1904 /*
1905 * To call huge_pmd_unshare, i_mmap_rwsem must be
1906 * held in write mode. Caller needs to explicitly
1907 * do this outside rmap routines.
1908 */
1909 VM_BUG_ON(!(flags & TTU_RMAP_LOCKED));
1910
1911 if (huge_pmd_unshare(mm, vma, &address, pvmw.pte)) {
1912 flush_tlb_range(vma, range.start, range.end);
1913 mmu_notifier_invalidate_range(mm, range.start,
1914 range.end);
1915
1916 /*
1917 * The ref count of the PMD page was dropped
1918 * which is part of the way map counting
1919 * is done for shared PMDs. Return 'true'
1920 * here. When there is no other sharing,
1921 * huge_pmd_unshare returns false and we will
1922 * unmap the actual page and drop map count
1923 * to zero.
1924 */
1925 page_vma_mapped_walk_done(&pvmw);
1926 break;
1927 }
1928 }
1929
1930 /* Nuke the hugetlb page table entry */
> 1931 pteval = huge_ptep_clear_flush(vma, address, pvmw.pte);
1932 } else {
1933 flush_cache_page(vma, address, pte_pfn(*pvmw.pte));
1934 /* Nuke the page table entry. */
1935 pteval = ptep_clear_flush(vma, address, pvmw.pte);
1936 }
1937
1938 /* Set the dirty flag on the folio now the pte is gone. */
1939 if (pte_dirty(pteval))
1940 folio_mark_dirty(folio);
1941
1942 /* Update high watermark before we lower rss */
1943 update_hiwater_rss(mm);
1944
1945 if (folio_is_zone_device(folio)) {
1946 unsigned long pfn = folio_pfn(folio);
1947 swp_entry_t entry;
1948 pte_t swp_pte;
1949
1950 if (anon_exclusive)
1951 BUG_ON(page_try_share_anon_rmap(subpage));
1952
1953 /*
1954 * Store the pfn of the page in a special migration
1955 * pte. do_swap_page() will wait until the migration
1956 * pte is removed and then restart fault handling.
1957 */
1958 entry = pte_to_swp_entry(pteval);
1959 if (is_writable_device_private_entry(entry))
1960 entry = make_writable_migration_entry(pfn);
1961 else if (anon_exclusive)
1962 entry = make_readable_exclusive_migration_entry(pfn);
1963 else
1964 entry = make_readable_migration_entry(pfn);
1965 swp_pte = swp_entry_to_pte(entry);
1966
1967 /*
1968 * pteval maps a zone device page and is therefore
1969 * a swap pte.
1970 */
1971 if (pte_swp_soft_dirty(pteval))
1972 swp_pte = pte_swp_mksoft_dirty(swp_pte);
1973 if (pte_swp_uffd_wp(pteval))
1974 swp_pte = pte_swp_mkuffd_wp(swp_pte);
1975 set_pte_at(mm, pvmw.address, pvmw.pte, swp_pte);
1976 trace_set_migration_pte(pvmw.address, pte_val(swp_pte),
1977 compound_order(&folio->page));
1978 /*
1979 * No need to invalidate here it will synchronize on
1980 * against the special swap migration pte.
1981 *
1982 * The assignment to subpage above was computed from a
1983 * swap PTE which results in an invalid pointer.
1984 * Since only PAGE_SIZE pages can currently be
1985 * migrated, just set it to page. This will need to be
1986 * changed when hugepage migrations to device private
1987 * memory are supported.
1988 */
1989 subpage = &folio->page;
1990 } else if (PageHWPoison(subpage)) {
1991 pteval = swp_entry_to_pte(make_hwpoison_entry(subpage));
1992 if (folio_test_hugetlb(folio)) {
1993 hugetlb_count_sub(folio_nr_pages(folio), mm);
1994 set_huge_swap_pte_at(mm, address,
1995 pvmw.pte, pteval,
1996 vma_mmu_pagesize(vma));
1997 } else {
1998 dec_mm_counter(mm, mm_counter(&folio->page));
1999 set_pte_at(mm, address, pvmw.pte, pteval);
2000 }
2001
2002 } else if (pte_unused(pteval) && !userfaultfd_armed(vma)) {
2003 /*
2004 * The guest indicated that the page content is of no
2005 * interest anymore. Simply discard the pte, vmscan
2006 * will take care of the rest.
2007 * A future reference will then fault in a new zero
2008 * page. When userfaultfd is active, we must not drop
2009 * this page though, as its main user (postcopy
2010 * migration) will not expect userfaults on already
2011 * copied pages.
2012 */
2013 dec_mm_counter(mm, mm_counter(&folio->page));
2014 /* We have to invalidate as we cleared the pte */
2015 mmu_notifier_invalidate_range(mm, address,
2016 address + PAGE_SIZE);
2017 } else {
2018 swp_entry_t entry;
2019 pte_t swp_pte;
2020
2021 if (arch_unmap_one(mm, vma, address, pteval) < 0) {
2022 if (folio_test_hugetlb(folio))
> 2023 set_huge_pte_at(mm, address, pvmw.pte, pteval);
2024 else
2025 set_pte_at(mm, address, pvmw.pte, pteval);
2026 ret = false;
2027 page_vma_mapped_walk_done(&pvmw);
2028 break;
2029 }
2030 VM_BUG_ON_PAGE(pte_write(pteval) && folio_test_anon(folio) &&
2031 !anon_exclusive, subpage);
2032 if (anon_exclusive &&
2033 page_try_share_anon_rmap(subpage)) {
2034 if (folio_test_hugetlb(folio))
2035 set_huge_pte_at(mm, address, pvmw.pte, pteval);
2036 else
2037 set_pte_at(mm, address, pvmw.pte, pteval);
2038 ret = false;
2039 page_vma_mapped_walk_done(&pvmw);
2040 break;
2041 }
2042
2043 /*
2044 * Store the pfn of the page in a special migration
2045 * pte. do_swap_page() will wait until the migration
2046 * pte is removed and then restart fault handling.
2047 */
2048 if (pte_write(pteval))
2049 entry = make_writable_migration_entry(
2050 page_to_pfn(subpage));
2051 else if (anon_exclusive)
2052 entry = make_readable_exclusive_migration_entry(
2053 page_to_pfn(subpage));
2054 else
2055 entry = make_readable_migration_entry(
2056 page_to_pfn(subpage));
2057
2058 swp_pte = swp_entry_to_pte(entry);
2059 if (pte_soft_dirty(pteval))
2060 swp_pte = pte_swp_mksoft_dirty(swp_pte);
2061 if (pte_uffd_wp(pteval))
2062 swp_pte = pte_swp_mkuffd_wp(swp_pte);
2063 if (folio_test_hugetlb(folio))
2064 set_huge_swap_pte_at(mm, address, pvmw.pte,
2065 swp_pte, vma_mmu_pagesize(vma));
2066 else
2067 set_pte_at(mm, address, pvmw.pte, swp_pte);
2068 trace_set_migration_pte(address, pte_val(swp_pte),
2069 compound_order(&folio->page));
2070 /*
2071 * No need to invalidate here it will synchronize on
2072 * against the special swap migration pte.
2073 */
2074 }
2075
2076 /*
2077 * No need to call mmu_notifier_invalidate_range() it has be
2078 * done above for all cases requiring it to happen under page
2079 * table lock before mmu_notifier_invalidate_range_end()
2080 *
2081 * See Documentation/vm/mmu_notifier.rst
2082 */
2083 page_remove_rmap(subpage, vma, folio_test_hugetlb(folio));
2084 if (vma->vm_flags & VM_LOCKED)
2085 mlock_page_drain_local();
2086 folio_put(folio);
2087 }
2088
2089 mmu_notifier_invalidate_range_end(&range);
2090
2091 return ret;
2092 }
2093
--
0-DAY CI Kernel Test Service
https://01.org/lkp
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-05-08 12:12 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-08 9:36 [PATCH v2 0/3] Fix CONT-PTE/PMD size hugetlb issue when unmapping or migrating Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` [PATCH v2 1/3] mm: change huge_ptep_clear_flush() to return the original pte Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 11:09 ` Muchun Song
2022-05-08 11:09 ` Muchun Song
2022-05-08 11:09 ` Muchun Song
2022-05-08 11:09 ` Muchun Song
2022-05-08 13:09 ` Baolin Wang
2022-05-08 13:09 ` Baolin Wang
2022-05-08 13:09 ` Baolin Wang
2022-05-08 13:09 ` Baolin Wang
2022-05-09 4:06 ` Muchun Song
2022-05-09 4:06 ` Muchun Song
2022-05-09 4:06 ` Muchun Song
2022-05-09 4:06 ` Muchun Song
2022-05-09 5:46 ` Christophe Leroy
2022-05-09 5:46 ` Christophe Leroy
2022-05-09 5:46 ` Christophe Leroy
2022-05-09 5:46 ` Christophe Leroy
2022-05-09 8:46 ` Baolin Wang
2022-05-09 8:46 ` Baolin Wang
2022-05-09 8:46 ` Baolin Wang
2022-05-09 8:46 ` Baolin Wang
2022-05-09 20:02 ` Mike Kravetz
2022-05-09 20:02 ` Mike Kravetz
2022-05-09 20:02 ` Mike Kravetz
2022-05-09 20:02 ` Mike Kravetz
2022-05-10 1:35 ` Baolin Wang
2022-05-10 1:35 ` Baolin Wang
2022-05-10 1:35 ` Baolin Wang
2022-05-10 1:35 ` Baolin Wang
2022-05-08 9:36 ` [PATCH v2 2/3] mm: rmap: Fix CONT-PTE/PMD size hugetlb issue when migration Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 12:01 ` kernel test robot
2022-05-08 12:01 ` kernel test robot
2022-05-08 12:01 ` kernel test robot
2022-05-08 12:01 ` kernel test robot
2022-05-08 13:13 ` Baolin Wang
2022-05-08 13:13 ` Baolin Wang
2022-05-08 13:13 ` Baolin Wang
2022-05-08 13:13 ` Baolin Wang
2022-05-08 13:13 ` Baolin Wang
2022-05-08 12:11 ` kernel test robot [this message]
2022-05-08 12:11 ` kernel test robot
2022-05-08 12:11 ` kernel test robot
2022-05-08 12:11 ` kernel test robot
2022-05-08 13:31 ` Muchun Song
2022-05-08 13:31 ` Muchun Song
2022-05-08 13:31 ` Muchun Song
2022-05-08 13:31 ` Muchun Song
2022-05-09 21:05 ` Mike Kravetz
2022-05-09 21:05 ` Mike Kravetz
2022-05-09 21:05 ` Mike Kravetz
2022-05-09 21:05 ` Mike Kravetz
2022-05-08 9:36 ` [PATCH v2 3/3] mm: rmap: Fix CONT-PTE/PMD size hugetlb issue when unmapping Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-08 9:36 ` Baolin Wang
2022-05-09 6:42 ` Muchun Song
2022-05-09 6:42 ` Muchun Song
2022-05-09 6:42 ` Muchun Song
2022-05-09 6:42 ` Muchun Song
2022-05-09 22:25 ` Mike Kravetz
2022-05-09 22:25 ` Mike Kravetz
2022-05-09 22:25 ` Mike Kravetz
2022-05-09 22:25 ` Mike Kravetz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202205081950.IpKFNYip-lkp@intel.com \
--to=lkp@intel.com \
--cc=James.Bottomley@hansenpartnership.com \
--cc=agordeev@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=baolin.wang@linux.alibaba.com \
--cc=benh@kernel.crashing.org \
--cc=borntraeger@linux.ibm.com \
--cc=catalin.marinas@arm.com \
--cc=dalias@libc.org \
--cc=davem@davemloft.net \
--cc=deller@gmx.de \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=kbuild-all@lists.01.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-ia64@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=linux-parisc@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=llvm@lists.linux.dev \
--cc=mike.kravetz@oracle.com \
--cc=mpe@ellerman.id.au \
--cc=paulus@samba.org \
--cc=sparclinux@vger.kernel.org \
--cc=svens@linux.ibm.com \
--cc=tsbogend@alpha.franken.de \
--cc=will@kernel.org \
--cc=ysato@users.sourceforge.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.