2022-02-28 07:00:30

by Muchun Song

[permalink] [raw]
Subject: [PATCH v3 4/6] mm: pvmw: add support for walking devmap pages

The devmap pages can not use page_vma_mapped_walk() to check if a huge
devmap page is mapped into a vma. Add support for walking huge devmap
pages so that DAX can use it in the next patch.

Signed-off-by: Muchun Song <[email protected]>
---
mm/page_vma_mapped.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 1187f9c1ec5b..3f337e4e7f5f 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -210,10 +210,10 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
*/
pmde = READ_ONCE(*pvmw->pmd);

- if (pmd_trans_huge(pmde) || is_pmd_migration_entry(pmde)) {
+ if (pmd_leaf(pmde) || is_pmd_migration_entry(pmde)) {
pvmw->ptl = pmd_lock(mm, pvmw->pmd);
pmde = *pvmw->pmd;
- if (likely(pmd_trans_huge(pmde))) {
+ if (likely(pmd_leaf(pmde))) {
if (pvmw->flags & PVMW_MIGRATION)
return not_found(pvmw);
if (!check_pmd(pmd_pfn(pmde), pvmw))
--
2.11.0


2022-02-28 19:16:54

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3 4/6] mm: pvmw: add support for walking devmap pages

Hi Muchun,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on hnaz-mm/master]
[also build test ERROR on next-20220225]
[cannot apply to linus/master v5.17-rc6]
[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/0day-ci/linux/commits/Muchun-Song/Fix-some-bugs-related-to-ramp-and-dax/20220228-143753
base: https://github.com/hnaz/linux-mm master
config: riscv-randconfig-r012-20220227 (https://download.01.org/0day-ci/archive/20220228/[email protected]/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project d271fc04d5b97b12e6b797c6067d3c96a8d7470e)
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 riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://github.com/0day-ci/linux/commit/4b08af172f30c61ae5f43ec23642e2767371247e
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Muchun-Song/Fix-some-bugs-related-to-ramp-and-dax/20220228-143753
git checkout 4b08af172f30c61ae5f43ec23642e2767371247e
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>):

>> mm/page_vma_mapped.c:113:13: error: call to __compiletime_assert_258 declared with 'error' attribute: BUILD_BUG failed
if ((pfn + HPAGE_PMD_NR - 1) < pvmw->pfn)
^
include/linux/huge_mm.h:105:26: note: expanded from macro 'HPAGE_PMD_NR'
#define HPAGE_PMD_NR (1<<HPAGE_PMD_ORDER)
^
include/linux/huge_mm.h:104:26: note: expanded from macro 'HPAGE_PMD_ORDER'
#define HPAGE_PMD_ORDER (HPAGE_PMD_SHIFT-PAGE_SHIFT)
^
include/linux/huge_mm.h:307:28: note: expanded from macro 'HPAGE_PMD_SHIFT'
#define HPAGE_PMD_SHIFT ({ BUILD_BUG(); 0; })
^
note: (skipping 3 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:335:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:328:4: note: expanded from macro '__compiletime_assert'
prefix ## suffix(); \
^
<scratch space>:73:1: note: expanded from here
__compiletime_assert_258
^
1 error generated.


vim +/error +113 mm/page_vma_mapped.c

9188af981d385d Andrew Morton 2022-02-25 109
9188af981d385d Andrew Morton 2022-02-25 110 /* Returns true if the two ranges overlap. Careful to not overflow. */
9188af981d385d Andrew Morton 2022-02-25 111 static bool check_pmd(unsigned long pfn, struct page_vma_mapped_walk *pvmw)
9188af981d385d Andrew Morton 2022-02-25 112 {
9188af981d385d Andrew Morton 2022-02-25 @113 if ((pfn + HPAGE_PMD_NR - 1) < pvmw->pfn)
9188af981d385d Andrew Morton 2022-02-25 114 return false;
9188af981d385d Andrew Morton 2022-02-25 115 if (pfn > pvmw->pfn + pvmw->nr_pages - 1)
9188af981d385d Andrew Morton 2022-02-25 116 return false;
9188af981d385d Andrew Morton 2022-02-25 117 return true;
ace71a19cec5eb Kirill A. Shutemov 2017-02-24 118 }
ace71a19cec5eb Kirill A. Shutemov 2017-02-24 119

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

2022-02-28 21:30:13

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH v3 4/6] mm: pvmw: add support for walking devmap pages

On Mon, 28 Feb 2022 14:35:34 +0800 Muchun Song <[email protected]> wrote:

> The devmap pages can not use page_vma_mapped_walk() to check if a huge
> devmap page is mapped into a vma. Add support for walking huge devmap
> pages so that DAX can use it in the next patch.
>

x86_64 allnoconfig:

In file included from <command-line>:
In function 'check_pmd',
inlined from 'page_vma_mapped_walk' at mm/page_vma_mapped.c:219:10:
././include/linux/compiler_types.h:347:45: error: call to '__compiletime_assert_232' declared with attribute error: BUILD_BUG failed
347 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^
././include/linux/compiler_types.h:328:25: note: in definition of macro '__compiletime_assert'
328 | prefix ## suffix(); \
| ^~~~~~
././include/linux/compiler_types.h:347:9: note: in expansion of macro '_compiletime_assert'
347 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
./include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
| ^~~~~~~~~~~~~~~~~~
./include/linux/build_bug.h:59:21: note: in expansion of macro 'BUILD_BUG_ON_MSG'
59 | #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
| ^~~~~~~~~~~~~~~~
./include/linux/huge_mm.h:307:28: note: in expansion of macro 'BUILD_BUG'
307 | #define HPAGE_PMD_SHIFT ({ BUILD_BUG(); 0; })
| ^~~~~~~~~
./include/linux/huge_mm.h:104:26: note: in expansion of macro 'HPAGE_PMD_SHIFT'
104 | #define HPAGE_PMD_ORDER (HPAGE_PMD_SHIFT-PAGE_SHIFT)
| ^~~~~~~~~~~~~~~
./include/linux/huge_mm.h:105:26: note: in expansion of macro 'HPAGE_PMD_ORDER'
105 | #define HPAGE_PMD_NR (1<<HPAGE_PMD_ORDER)
| ^~~~~~~~~~~~~~~
mm/page_vma_mapped.c:113:20: note: in expansion of macro 'HPAGE_PMD_NR'
113 | if ((pfn + HPAGE_PMD_NR - 1) < pvmw->pfn)
| ^~~~~~~~~~~~
make[1]: *** [scripts/Makefile.build:288: mm/page_vma_mapped.o] Error 1
make: *** [Makefile:1971: mm] Error 2


because check_pmd() uses HPAGE_PMD_NR and

#else /* CONFIG_TRANSPARENT_HUGEPAGE */
#define HPAGE_PMD_SHIFT ({ BUILD_BUG(); 0; })

I don't immediately see why this patch triggers it...

2022-03-01 04:12:30

by Muchun Song

[permalink] [raw]
Subject: Re: [PATCH v3 4/6] mm: pvmw: add support for walking devmap pages

On Tue, Mar 1, 2022 at 5:26 AM Andrew Morton <[email protected]> wrote:
>
> On Mon, 28 Feb 2022 14:35:34 +0800 Muchun Song <[email protected]> wrote:
>
> > The devmap pages can not use page_vma_mapped_walk() to check if a huge
> > devmap page is mapped into a vma. Add support for walking huge devmap
> > pages so that DAX can use it in the next patch.
> >
>
> x86_64 allnoconfig:
>
> In file included from <command-line>:
> In function 'check_pmd',
> inlined from 'page_vma_mapped_walk' at mm/page_vma_mapped.c:219:10:
> ././include/linux/compiler_types.h:347:45: error: call to '__compiletime_assert_232' declared with attribute error: BUILD_BUG failed
> 347 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
> | ^
> ././include/linux/compiler_types.h:328:25: note: in definition of macro '__compiletime_assert'
> 328 | prefix ## suffix(); \
> | ^~~~~~
> ././include/linux/compiler_types.h:347:9: note: in expansion of macro '_compiletime_assert'
> 347 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
> | ^~~~~~~~~~~~~~~~~~~
> ./include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
> 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
> | ^~~~~~~~~~~~~~~~~~
> ./include/linux/build_bug.h:59:21: note: in expansion of macro 'BUILD_BUG_ON_MSG'
> 59 | #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
> | ^~~~~~~~~~~~~~~~
> ./include/linux/huge_mm.h:307:28: note: in expansion of macro 'BUILD_BUG'
> 307 | #define HPAGE_PMD_SHIFT ({ BUILD_BUG(); 0; })
> | ^~~~~~~~~
> ./include/linux/huge_mm.h:104:26: note: in expansion of macro 'HPAGE_PMD_SHIFT'
> 104 | #define HPAGE_PMD_ORDER (HPAGE_PMD_SHIFT-PAGE_SHIFT)
> | ^~~~~~~~~~~~~~~
> ./include/linux/huge_mm.h:105:26: note: in expansion of macro 'HPAGE_PMD_ORDER'
> 105 | #define HPAGE_PMD_NR (1<<HPAGE_PMD_ORDER)
> | ^~~~~~~~~~~~~~~
> mm/page_vma_mapped.c:113:20: note: in expansion of macro 'HPAGE_PMD_NR'
> 113 | if ((pfn + HPAGE_PMD_NR - 1) < pvmw->pfn)
> | ^~~~~~~~~~~~
> make[1]: *** [scripts/Makefile.build:288: mm/page_vma_mapped.o] Error 1
> make: *** [Makefile:1971: mm] Error 2
>
>
> because check_pmd() uses HPAGE_PMD_NR and
>
> #else /* CONFIG_TRANSPARENT_HUGEPAGE */
> #define HPAGE_PMD_SHIFT ({ BUILD_BUG(); 0; })
>
> I don't immediately see why this patch triggers it...

Maybe the reason is as follows.

The first check_pmd() is wrapped inside `if (pmd_trans_huge(pmde))`
block, since pmd_trans_huge() just returns 0, check_pmd() will be
optimized out. There is a `if (!thp_migration_supported()) return;` block
before the second check_pmd(), however, thp_migration_supported()
returns 0 on riscv. So the second check_pmd() can be optimized out as
well. I think I should replace `pmd_leaf` with `pmd_trans_huge() ||
pmd_devmap()`
to fix it.

Thanks.