Hi all, After merging the akpm-current tree, today's linux-next build (arm multi_v7_defconfig) failed like this: mm/madvise.c: In function 'madvise_cold_page_range': mm/madvise.c:459:4: error: 'struct mm_walk' has no member named 'pmd_entry' 459 | .pmd_entry = madvise_cold_or_pageout_pte_range, | ^~~~~~~~~ mm/madvise.c:459:16: error: initialization of 'const struct mm_walk_ops *' from incompatible pointer type 'int (*)(pmd_t *, long unsigned int, long unsigned int, struct mm_walk *)' {aka 'int (*)(unsigned int *, long unsigned int, long unsigned int, struct mm_walk *)'} [-Werror=incompatible-pointer-types] 459 | .pmd_entry = madvise_cold_or_pageout_pte_range, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mm/madvise.c:459:16: note: (near initialization for 'cold_walk.ops') mm/madvise.c:465:18: warning: passing argument 1 of 'walk_page_range' makes pointer from integer without a cast [-Wint-conversion] 465 | walk_page_range(addr, end, &cold_walk); | ^~~~ | | | long unsigned int In file included from mm/madvise.c:24: include/linux/pagewalk.h:60:39: note: expected 'struct mm_struct *' but argument is of type 'long unsigned int' 60 | int walk_page_range(struct mm_struct *mm, unsigned long start, | ~~~~~~~~~~~~~~~~~~^~ mm/madvise.c:465:29: warning: passing argument 3 of 'walk_page_range' makes integer from pointer without a cast [-Wint-conversion] 465 | walk_page_range(addr, end, &cold_walk); | ^~~~~~~~~~ | | | struct mm_walk * In file included from mm/madvise.c:24: include/linux/pagewalk.h:61:17: note: expected 'long unsigned int' but argument is of type 'struct mm_walk *' 61 | unsigned long end, const struct mm_walk_ops *ops, | ~~~~~~~~~~~~~~^~~ mm/madvise.c:465:2: error: too few arguments to function 'walk_page_range' 465 | walk_page_range(addr, end, &cold_walk); | ^~~~~~~~~~~~~~~ In file included from mm/madvise.c:24: include/linux/pagewalk.h:60:5: note: declared here 60 | int walk_page_range(struct mm_struct *mm, unsigned long start, | ^~~~~~~~~~~~~~~ mm/madvise.c: In function 'madvise_pageout_page_range': mm/madvise.c:498:4: error: 'struct mm_walk' has no member named 'pmd_entry' 498 | .pmd_entry = madvise_cold_or_pageout_pte_range, | ^~~~~~~~~ mm/madvise.c:498:16: error: initialization of 'const struct mm_walk_ops *' from incompatible pointer type 'int (*)(pmd_t *, long unsigned int, long unsigned int, struct mm_walk *)' {aka 'int (*)(unsigned int *, long unsigned int, long unsigned int, struct mm_walk *)'} [-Werror=incompatible-pointer-types] 498 | .pmd_entry = madvise_cold_or_pageout_pte_range, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mm/madvise.c:498:16: note: (near initialization for 'pageout_walk.ops') mm/madvise.c:504:18: warning: passing argument 1 of 'walk_page_range' makes pointer from integer without a cast [-Wint-conversion] 504 | walk_page_range(addr, end, &pageout_walk); | ^~~~ | | | long unsigned int In file included from mm/madvise.c:24: include/linux/pagewalk.h:60:39: note: expected 'struct mm_struct *' but argument is of type 'long unsigned int' 60 | int walk_page_range(struct mm_struct *mm, unsigned long start, | ~~~~~~~~~~~~~~~~~~^~ mm/madvise.c:504:29: warning: passing argument 3 of 'walk_page_range' makes integer from pointer without a cast [-Wint-conversion] 504 | walk_page_range(addr, end, &pageout_walk); | ^~~~~~~~~~~~~ | | | struct mm_walk * In file included from mm/madvise.c:24: include/linux/pagewalk.h:61:17: note: expected 'long unsigned int' but argument is of type 'struct mm_walk *' 61 | unsigned long end, const struct mm_walk_ops *ops, | ~~~~~~~~~~~~~~^~~ mm/madvise.c:504:2: error: too few arguments to function 'walk_page_range' 504 | walk_page_range(addr, end, &pageout_walk); | ^~~~~~~~~~~~~~~ In file included from mm/madvise.c:24: include/linux/pagewalk.h:60:5: note: declared here 60 | int walk_page_range(struct mm_struct *mm, unsigned long start, | ^~~~~~~~~~~~~~~ Caused by commit 1c8999b3963d ("mm: introduce MADV_COLD") (and following commits) interacting with commit 923bfc561e75 ("pagewalk: separate function pointers from iterator data") from the hmm tree. I have applied the following patch for today: From: Stephen Rothwell Date: Fri, 30 Aug 2019 23:39:37 +1000 Subject: [PATCH] mm: merge fix for "pagewalk: separate function pointers from iterator data" Signed-off-by: Stephen Rothwell --- mm/madvise.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 7ec7c8f6d5ab..20598df8360a 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -446,6 +446,10 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, return 0; } +static const struct mm_walk_ops cold_walk_ops = { + .pmd_entry = madvise_cold_or_pageout_pte_range, +}; + static void madvise_cold_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma, unsigned long addr, unsigned long end) @@ -455,14 +459,8 @@ static void madvise_cold_page_range(struct mmu_gather *tlb, .pageout = false, }; - struct mm_walk cold_walk = { - .pmd_entry = madvise_cold_or_pageout_pte_range, - .mm = vma->vm_mm, - .private = &walk_private, - }; - tlb_start_vma(tlb, vma); - walk_page_range(addr, end, &cold_walk); + walk_page_range(vma->vm_mm, addr, end, &cold_walk_ops, &walk_private); tlb_end_vma(tlb, vma); } @@ -485,6 +483,10 @@ static long madvise_cold(struct vm_area_struct *vma, return 0; } +static const struct mm_walk_ops pageout_walk_ops = { + .pmd_entry = madvise_cold_or_pageout_pte_range, +}; + static void madvise_pageout_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma, unsigned long addr, unsigned long end) @@ -494,14 +496,8 @@ static void madvise_pageout_page_range(struct mmu_gather *tlb, .tlb = tlb, }; - struct mm_walk pageout_walk = { - .pmd_entry = madvise_cold_or_pageout_pte_range, - .mm = vma->vm_mm, - .private = &walk_private, - }; - tlb_start_vma(tlb, vma); - walk_page_range(addr, end, &pageout_walk); + walk_page_range(vma->vm_mm, addr, end, &pageout_walk_ops, &walk_private); tlb_end_vma(tlb, vma); } -- 2.23.0.rc1 -- Cheers, Stephen Rothwell