Convert vms_clear_ptes() to use unmap_desc to call unmap_vmas() instead
of the large argument list. The UNMAP_STATE() cannot be used because
the vma iterator in the vms does not point to the correct maple state
(mas_detach), and the tree_end will be set incorrectly. Setting up the
arguments manually avoids setting the struct up incorrectly and doing
extra work to get the correct pagetable range.
exit_mmap() also calls unmap_vmas() with many arguments. Using the
unmap_all_init() function to set the unmap descriptor for all vmas makes
this a bit easier to read.
Update to the vma test code is necessary to ensure testing continues to
function.
No functional changes intended.
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
---
include/linux/mm.h | 4 ----
mm/internal.h | 3 +++
mm/memory.c | 20 ++++++++------------
mm/mmap.c | 4 +++-
mm/vma.c | 27 ++++++++++++++++++++++-----
mm/vma.h | 14 ++++++++++++++
tools/testing/vma/vma_internal.h | 6 +++---
7 files changed, 53 insertions(+), 25 deletions(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index cb3de0c73d030..3164b897283f1 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -2624,10 +2624,6 @@ static inline void zap_vma_pages(struct vm_area_struct *vma)
zap_page_range_single(vma, vma->vm_start,
vma->vm_end - vma->vm_start, NULL);
}
-void unmap_vmas(struct mmu_gather *tlb, struct ma_state *mas,
- struct vm_area_struct *start_vma, unsigned long start,
- unsigned long end, unsigned long tree_end);
-
struct mmu_notifier_range;
void free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
diff --git a/mm/internal.h b/mm/internal.h
index 2cdc5c9396f10..25a17eea550b8 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -197,6 +197,9 @@ static inline void vma_close(struct vm_area_struct *vma)
}
}
+/* unmap_vmas is in mm/memory.c */
+void unmap_vmas(struct mmu_gather *tlb, struct unmap_desc *unmap);
+
#ifdef CONFIG_MMU
static inline void get_anon_vma(struct anon_vma *anon_vma)
diff --git a/mm/memory.c b/mm/memory.c
index 4331a6abe3e4c..6fd6decc139e9 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2083,11 +2083,7 @@ static void unmap_single_vma(struct mmu_gather *tlb,
/**
* unmap_vmas - unmap a range of memory covered by a list of vma's
* @tlb: address of the caller's struct mmu_gather
- * @mas: the maple state
- * @vma: the starting vma
- * @start_addr: virtual address at which to start unmapping
- * @end_addr: virtual address at which to end unmapping
- * @tree_end: The maximum index to check
+ * @unmap: The unmap_desc
*
* Unmap all pages in the vma list.
*
@@ -2100,10 +2096,9 @@ static void unmap_single_vma(struct mmu_gather *tlb,
* ensure that any thus-far unmapped pages are flushed before unmap_vmas()
* drops the lock and schedules.
*/
-void unmap_vmas(struct mmu_gather *tlb, struct ma_state *mas,
- struct vm_area_struct *vma, unsigned long start_addr,
- unsigned long end_addr, unsigned long tree_end)
+void unmap_vmas(struct mmu_gather *tlb, struct unmap_desc *unmap)
{
+ struct vm_area_struct *vma;
struct mmu_notifier_range range;
struct zap_details details = {
.zap_flags = ZAP_FLAG_DROP_MARKER | ZAP_FLAG_UNMAP,
@@ -2111,16 +2106,17 @@ void unmap_vmas(struct mmu_gather *tlb, struct ma_state *mas,
.even_cows = true,
};
+ vma = unmap->first;
mmu_notifier_range_init(&range, MMU_NOTIFY_UNMAP, 0, vma->vm_mm,
- start_addr, end_addr);
+ unmap->vma_start, unmap->vma_end);
mmu_notifier_invalidate_range_start(&range);
do {
- unsigned long start = start_addr;
- unsigned long end = end_addr;
+ unsigned long start = unmap->vma_start;
+ unsigned long end = unmap->vma_end;
hugetlb_zap_begin(vma, &start, &end);
unmap_single_vma(tlb, vma, start, end, &details);
hugetlb_zap_end(vma, &details);
- vma = mas_find(mas, tree_end - 1);
+ vma = mas_find(unmap->mas, unmap->tree_end - 1);
} while (vma);
mmu_notifier_invalidate_range_end(&range);
}
diff --git a/mm/mmap.c b/mm/mmap.c
index 4500e61a0d5e4..042b6b4b6ab86 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1277,6 +1277,7 @@ void exit_mmap(struct mm_struct *mm)
struct vm_area_struct *vma;
unsigned long nr_accounted = 0;
VMA_ITERATOR(vmi, mm, 0);
+ struct unmap_desc unmap;
/* mm's last user has gone, and its about to be pulled down */
mmu_notifier_release(mm);
@@ -1292,11 +1293,12 @@ void exit_mmap(struct mm_struct *mm)
goto destroy;
}
+ unmap_all_init(&unmap, &vmi, vma);
flush_cache_mm(mm);
tlb_gather_mmu_fullmm(&tlb, mm);
/* update_hiwater_rss(mm) here? but nobody should be looking */
/* Use ULONG_MAX here to ensure all VMAs in the mm are unmapped */
- unmap_vmas(&tlb, &vmi.mas, vma, 0, ULONG_MAX, ULONG_MAX);
+ unmap_vmas(&tlb, &unmap);
mmap_read_unlock(mm);
/*
diff --git a/mm/vma.c b/mm/vma.c
index 75c68c74c062e..b46c869d4bb07 100644
--- a/mm/vma.c
+++ b/mm/vma.c
@@ -480,8 +480,7 @@ void unmap_region(struct unmap_desc *unmap)
tlb_gather_mmu(&tlb, mm);
update_hiwater_rss(mm);
- unmap_vmas(&tlb, mas, unmap->first, unmap->vma_start, unmap->vma_end,
- unmap->vma_end);
+ unmap_vmas(&tlb, unmap);
mas_set(mas, unmap->tree_reset);
free_pgtables(&tlb, mas, unmap->first, unmap->pg_start, unmap->pg_end,
unmap->tree_end, unmap->mm_wr_locked);
@@ -1257,6 +1256,26 @@ static inline void vms_clear_ptes(struct vma_munmap_struct *vms,
struct ma_state *mas_detach, bool mm_wr_locked)
{
struct mmu_gather tlb;
+ struct unmap_desc unmap = {
+ .mas = mas_detach,
+ .first = vms->vma,
+ /* start and end may be different if there is no prev or next vma. */
+ .pg_start = vms->unmap_start,
+ .pg_end = vms->unmap_end,
+ .vma_start = vms->start,
+ .vma_end = vms->end,
+ /*
+ * The tree limits and reset differ from the normal case since it's a
+ * side-tree
+ */
+ .tree_reset = 1,
+ .tree_end = vms->vma_count,
+ /*
+ * We can free page tables without write-locking mmap_lock because VMAs
+ * were isolated before we downgraded mmap_lock.
+ */
+ .mm_wr_locked = mm_wr_locked,
+ };
if (!vms->clear_ptes) /* Nothing to do */
return;
@@ -1268,9 +1287,7 @@ static inline void vms_clear_ptes(struct vma_munmap_struct *vms,
mas_set(mas_detach, 1);
tlb_gather_mmu(&tlb, vms->vma->vm_mm);
update_hiwater_rss(vms->vma->vm_mm);
- unmap_vmas(&tlb, mas_detach, vms->vma, vms->start, vms->end,
- vms->vma_count);
-
+ unmap_vmas(&tlb, &unmap);
mas_set(mas_detach, 1);
/* start and end may be different if there is no prev or next vma. */
free_pgtables(&tlb, mas_detach, vms->vma, vms->unmap_start,
diff --git a/mm/vma.h b/mm/vma.h
index cca7553c7d641..bb7fa5d2bde25 100644
--- a/mm/vma.h
+++ b/mm/vma.h
@@ -167,6 +167,20 @@ struct unmap_desc {
bool mm_wr_locked; /* If the mmap write lock is held */
};
+static inline void unmap_all_init(struct unmap_desc *unmap,
+ struct vma_iterator *vmi, struct vm_area_struct *vma)
+{
+ unmap->mas = &vmi->mas;
+ unmap->first = vma;
+ unmap->pg_start = FIRST_USER_ADDRESS;
+ unmap->pg_end = USER_PGTABLES_CEILING;
+ unmap->vma_start = 0;
+ unmap->vma_end = ULONG_MAX;
+ unmap->tree_end = ULONG_MAX;
+ unmap->tree_reset = vma->vm_end;
+ unmap->mm_wr_locked = false;
+}
+
#define UNMAP_STATE(name, _vmi, _vma, _vma_start, _vma_end, _prev, _next) \
struct unmap_desc name = { \
.mas = &(_vmi)->mas, \
diff --git a/tools/testing/vma/vma_internal.h b/tools/testing/vma/vma_internal.h
index f50b8ddee6120..0b4918aac8d6d 100644
--- a/tools/testing/vma/vma_internal.h
+++ b/tools/testing/vma/vma_internal.h
@@ -1131,9 +1131,9 @@ static inline void update_hiwater_vm(struct mm_struct *mm)
{
}
-static inline void unmap_vmas(struct mmu_gather *tlb, struct ma_state *mas,
- struct vm_area_struct *vma, unsigned long start_addr,
- unsigned long end_addr, unsigned long tree_end)
+struct unmap_desc;
+
+static inline void unmap_vmas(struct mmu_gather *tlb, struct unmap_desc *unmap)
{
}
--
2.47.3
Hi Liam,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on linus/master v6.19-rc5 next-20260115]
[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#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Liam-R-Howlett/mm-mmap-Move-exit_mmap-trace-point/20260116-023126
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20260115182720.1691130-9-Liam.Howlett%40oracle.com
patch subject: [PATCH v2 08/10] mm/vma: Use unmap_desc in exit_mmap() and vms_clear_ptes()
config: m68k-allnoconfig (https://download.01.org/0day-ci/archive/20260116/202601160925.VR8a2hUw-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260116/202601160925.VR8a2hUw-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601160925.VR8a2hUw-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from mm/internal.h:23,
from mm/filemap.c:54:
mm/vma.h: In function 'unmap_all_init':
>> mm/vma.h:175:27: error: 'FIRST_USER_ADDRESS' undeclared (first use in this function)
175 | unmap->pg_start = FIRST_USER_ADDRESS;
| ^~~~~~~~~~~~~~~~~~
mm/vma.h:175:27: note: each undeclared identifier is reported only once for each function it appears in
>> mm/vma.h:176:25: error: 'USER_PGTABLES_CEILING' undeclared (first use in this function)
176 | unmap->pg_end = USER_PGTABLES_CEILING;
| ^~~~~~~~~~~~~~~~~~~~~
vim +/FIRST_USER_ADDRESS +175 mm/vma.h
169
170 static inline void unmap_all_init(struct unmap_desc *unmap,
171 struct vma_iterator *vmi, struct vm_area_struct *vma)
172 {
173 unmap->mas = &vmi->mas;
174 unmap->first = vma;
> 175 unmap->pg_start = FIRST_USER_ADDRESS;
> 176 unmap->pg_end = USER_PGTABLES_CEILING;
177 unmap->vma_start = 0;
178 unmap->vma_end = ULONG_MAX;
179 unmap->tree_end = ULONG_MAX;
180 unmap->tree_reset = vma->vm_end;
181 unmap->mm_wr_locked = false;
182 }
183
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On Fri, Jan 16, 2026 at 10:04:27AM +0800, kernel test robot wrote:
> Hi Liam,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on akpm-mm/mm-everything]
> [also build test ERROR on linus/master v6.19-rc5 next-20260115]
> [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#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Liam-R-Howlett/mm-mmap-Move-exit_mmap-trace-point/20260116-023126
> base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link: https://lore.kernel.org/r/20260115182720.1691130-9-Liam.Howlett%40oracle.com
> patch subject: [PATCH v2 08/10] mm/vma: Use unmap_desc in exit_mmap() and vms_clear_ptes()
> config: m68k-allnoconfig (https://download.01.org/0day-ci/archive/20260116/202601160925.VR8a2hUw-lkp@intel.com/config)
> compiler: m68k-linux-gcc (GCC) 15.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260116/202601160925.VR8a2hUw-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202601160925.VR8a2hUw-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> In file included from mm/internal.h:23,
> from mm/filemap.c:54:
> mm/vma.h: In function 'unmap_all_init':
> >> mm/vma.h:175:27: error: 'FIRST_USER_ADDRESS' undeclared (first use in this function)
> 175 | unmap->pg_start = FIRST_USER_ADDRESS;
> | ^~~~~~~~~~~~~~~~~~
> mm/vma.h:175:27: note: each undeclared identifier is reported only once for each function it appears in
> >> mm/vma.h:176:25: error: 'USER_PGTABLES_CEILING' undeclared (first use in this function)
> 176 | unmap->pg_end = USER_PGTABLES_CEILING;
> | ^~~~~~~~~~~~~~~~~~~~~
>
Suspect you need to add:
#include <linux/pgtable.h>
to mm/vma_internal.h.
Some arches don't define it and that header has:
#ifndef USER_PGTABLES_CEILING
#define USER_PGTABLES_CEILING 0UL
#endif
...
#ifndef FIRST_USER_ADDRESS
#define FIRST_USER_ADDRESS 0UL
#endif
>
> vim +/FIRST_USER_ADDRESS +175 mm/vma.h
>
> 169
> 170 static inline void unmap_all_init(struct unmap_desc *unmap,
> 171 struct vma_iterator *vmi, struct vm_area_struct *vma)
> 172 {
> 173 unmap->mas = &vmi->mas;
> 174 unmap->first = vma;
> > 175 unmap->pg_start = FIRST_USER_ADDRESS;
> > 176 unmap->pg_end = USER_PGTABLES_CEILING;
> 177 unmap->vma_start = 0;
> 178 unmap->vma_end = ULONG_MAX;
> 179 unmap->tree_end = ULONG_MAX;
> 180 unmap->tree_reset = vma->vm_end;
> 181 unmap->mm_wr_locked = false;
> 182 }
> 183
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
Cheers, Lorenzo
* Lorenzo Stoakes <lorenzo.stoakes@oracle.com> [260116 03:27]:
> On Fri, Jan 16, 2026 at 10:04:27AM +0800, kernel test robot wrote:
> > Hi Liam,
> >
> > kernel test robot noticed the following build errors:
> >
> > [auto build test ERROR on akpm-mm/mm-everything]
> > [also build test ERROR on linus/master v6.19-rc5 next-20260115]
> > [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#_base_tree_information]
> >
> > url: https://github.com/intel-lab-lkp/linux/commits/Liam-R-Howlett/mm-mmap-Move-exit_mmap-trace-point/20260116-023126
> > base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> > patch link: https://lore.kernel.org/r/20260115182720.1691130-9-Liam.Howlett%40oracle.com
> > patch subject: [PATCH v2 08/10] mm/vma: Use unmap_desc in exit_mmap() and vms_clear_ptes()
> > config: m68k-allnoconfig (https://download.01.org/0day-ci/archive/20260116/202601160925.VR8a2hUw-lkp@intel.com/config)
> > compiler: m68k-linux-gcc (GCC) 15.2.0
> > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260116/202601160925.VR8a2hUw-lkp@intel.com/reproduce)
> >
> > If you fix the issue in a separate patch/commit (i.e. not just a new version of
> > the same patch/commit), kindly add following tags
> > | Reported-by: kernel test robot <lkp@intel.com>
> > | Closes: https://lore.kernel.org/oe-kbuild-all/202601160925.VR8a2hUw-lkp@intel.com/
> >
> > All errors (new ones prefixed by >>):
> >
> > In file included from mm/internal.h:23,
> > from mm/filemap.c:54:
> > mm/vma.h: In function 'unmap_all_init':
> > >> mm/vma.h:175:27: error: 'FIRST_USER_ADDRESS' undeclared (first use in this function)
> > 175 | unmap->pg_start = FIRST_USER_ADDRESS;
> > | ^~~~~~~~~~~~~~~~~~
> > mm/vma.h:175:27: note: each undeclared identifier is reported only once for each function it appears in
> > >> mm/vma.h:176:25: error: 'USER_PGTABLES_CEILING' undeclared (first use in this function)
> > 176 | unmap->pg_end = USER_PGTABLES_CEILING;
> > | ^~~~~~~~~~~~~~~~~~~~~
> >
>
> Suspect you need to add:
>
> #include <linux/pgtable.h>
>
> to mm/vma_internal.h.
>
> Some arches don't define it and that header has:
>
> #ifndef USER_PGTABLES_CEILING
> #define USER_PGTABLES_CEILING 0UL
> #endif
>
> ...
>
> #ifndef FIRST_USER_ADDRESS
> #define FIRST_USER_ADDRESS 0UL
> #endif
Thanks.
This was hit on v1 and I forgot to fix it.
>
>
> >
> > vim +/FIRST_USER_ADDRESS +175 mm/vma.h
> >
> > 169
> > 170 static inline void unmap_all_init(struct unmap_desc *unmap,
> > 171 struct vma_iterator *vmi, struct vm_area_struct *vma)
> > 172 {
> > 173 unmap->mas = &vmi->mas;
> > 174 unmap->first = vma;
> > > 175 unmap->pg_start = FIRST_USER_ADDRESS;
> > > 176 unmap->pg_end = USER_PGTABLES_CEILING;
> > 177 unmap->vma_start = 0;
> > 178 unmap->vma_end = ULONG_MAX;
> > 179 unmap->tree_end = ULONG_MAX;
> > 180 unmap->tree_reset = vma->vm_end;
> > 181 unmap->mm_wr_locked = false;
> > 182 }
> > 183
> >
> > --
> > 0-DAY CI Kernel Test Service
> > https://github.com/intel/lkp-tests/wiki
>
> Cheers, Lorenzo
On Fri, 16 Jan 2026 11:15:43 -0500 "Liam R. Howlett" <Liam.Howlett@oracle.com> wrote:
> * Lorenzo Stoakes <lorenzo.stoakes@oracle.com> [260116 03:27]:
> > On Fri, Jan 16, 2026 at 10:04:27AM +0800, kernel test robot wrote:
> > > Hi Liam,
> > >
> > > kernel test robot noticed the following build errors:
> > >
> > > [auto build test ERROR on akpm-mm/mm-everything]
> > > [also build test ERROR on linus/master v6.19-rc5 next-20260115]
> > > [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#_base_tree_information]
> > >
> > > url: https://github.com/intel-lab-lkp/linux/commits/Liam-R-Howlett/mm-mmap-Move-exit_mmap-trace-point/20260116-023126
> > > base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> > > patch link: https://lore.kernel.org/r/20260115182720.1691130-9-Liam.Howlett%40oracle.com
> > > patch subject: [PATCH v2 08/10] mm/vma: Use unmap_desc in exit_mmap() and vms_clear_ptes()
> > > config: m68k-allnoconfig (https://download.01.org/0day-ci/archive/20260116/202601160925.VR8a2hUw-lkp@intel.com/config)
> > > compiler: m68k-linux-gcc (GCC) 15.2.0
> > > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260116/202601160925.VR8a2hUw-lkp@intel.com/reproduce)
> > >
> > > If you fix the issue in a separate patch/commit (i.e. not just a new version of
> > > the same patch/commit), kindly add following tags
> > > | Reported-by: kernel test robot <lkp@intel.com>
> > > | Closes: https://lore.kernel.org/oe-kbuild-all/202601160925.VR8a2hUw-lkp@intel.com/
> > >
> > > All errors (new ones prefixed by >>):
> > >
> > > In file included from mm/internal.h:23,
> > > from mm/filemap.c:54:
> > > mm/vma.h: In function 'unmap_all_init':
> > > >> mm/vma.h:175:27: error: 'FIRST_USER_ADDRESS' undeclared (first use in this function)
> > > 175 | unmap->pg_start = FIRST_USER_ADDRESS;
> > > | ^~~~~~~~~~~~~~~~~~
> > > mm/vma.h:175:27: note: each undeclared identifier is reported only once for each function it appears in
> > > >> mm/vma.h:176:25: error: 'USER_PGTABLES_CEILING' undeclared (first use in this function)
> > > 176 | unmap->pg_end = USER_PGTABLES_CEILING;
> > > | ^~~~~~~~~~~~~~~~~~~~~
> > >
> >
> > Suspect you need to add:
> >
> > #include <linux/pgtable.h>
> >
> > to mm/vma_internal.h.
> >
> > Some arches don't define it and that header has:
> >
> > #ifndef USER_PGTABLES_CEILING
> > #define USER_PGTABLES_CEILING 0UL
> > #endif
> >
> > ...
> >
> > #ifndef FIRST_USER_ADDRESS
> > #define FIRST_USER_ADDRESS 0UL
> > #endif
But the macro definitions are enclosed by '#ifdef CONFIG_MMU'. I have
!CONFIG_MMU build test, which shows similar errors, even after Lorenzo's
suggestion is applied. Should we move the definitions out of the '#ifdef
CONFIG_MMU', or implement another unmap_all_init() for !CONFIG_MMU case?
I confirmed a simple version of the first option (moving definitions out of
CONFIG_MMU, in addition to including pgtable.h) like below works at least for
my !CONFIG_MMU test.
Thanks,
SJ
[...]
=== >8 ===
From d5b441af2f31164a46240ce4179db8e0d2fff372 Mon Sep 17 00:00:00 2001
From: SeongJae Park <sj@kernel.org>
Date: Fri, 16 Jan 2026 17:01:27 -0800
Subject: [PATCH] mm/vma: temporal build fix
Link: https://lkml.kernel.org/r/20260115182720.1691130-9-Liam.Howlett@oracle.com
Signed-off-by: SeongJae Park <sj@kernel.org>
---
include/linux/pgtable.h | 38 +++++++++++++++++++-------------------
mm/vma_internal.h | 1 +
2 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
index ce2dbebade4c..4f063438a4fc 100644
--- a/include/linux/pgtable.h
+++ b/include/linux/pgtable.h
@@ -22,25 +22,6 @@
#error CONFIG_PGTABLE_LEVELS is not consistent with __PAGETABLE_{P4D,PUD,PMD}_FOLDED
#endif
-/*
- * On almost all architectures and configurations, 0 can be used as the
- * upper ceiling to free_pgtables(): on many architectures it has the same
- * effect as using TASK_SIZE. However, there is one configuration which
- * must impose a more careful limit, to avoid freeing kernel pgtables.
- */
-#ifndef USER_PGTABLES_CEILING
-#define USER_PGTABLES_CEILING 0UL
-#endif
-
-/*
- * This defines the first usable user address. Platforms
- * can override its value with custom FIRST_USER_ADDRESS
- * defined in their respective <asm/pgtable.h>.
- */
-#ifndef FIRST_USER_ADDRESS
-#define FIRST_USER_ADDRESS 0UL
-#endif
-
/*
* This defines the generic helper for accessing PMD page
* table page. Although platforms can still override this
@@ -1660,6 +1641,25 @@ void arch_sync_kernel_mappings(unsigned long start, unsigned long end);
#endif /* CONFIG_MMU */
+/*
+ * On almost all architectures and configurations, 0 can be used as the
+ * upper ceiling to free_pgtables(): on many architectures it has the same
+ * effect as using TASK_SIZE. However, there is one configuration which
+ * must impose a more careful limit, to avoid freeing kernel pgtables.
+ */
+#ifndef USER_PGTABLES_CEILING
+#define USER_PGTABLES_CEILING 0UL
+#endif
+
+/*
+ * This defines the first usable user address. Platforms
+ * can override its value with custom FIRST_USER_ADDRESS
+ * defined in their respective <asm/pgtable.h>.
+ */
+#ifndef FIRST_USER_ADDRESS
+#define FIRST_USER_ADDRESS 0UL
+#endif
+
/*
* No-op macros that just return the current protection value. Defined here
* because these macros can be used even if CONFIG_MMU is not defined.
diff --git a/mm/vma_internal.h b/mm/vma_internal.h
index 2f05735ff190..2da6d224c1a8 100644
--- a/mm/vma_internal.h
+++ b/mm/vma_internal.h
@@ -46,6 +46,7 @@
#include <linux/swap.h>
#include <linux/uprobes.h>
#include <linux/userfaultfd_k.h>
+#include <linux/pgtable.h>
#include <asm/current.h>
#include <asm/tlb.h>
--
2.47.3
On Fri, 16 Jan 2026 17:07:06 -0800 SeongJae Park <sj@kernel.org> wrote: > > > Suspect you need to add: > > > > > > #include <linux/pgtable.h> > > > > > > to mm/vma_internal.h. > > > > > > Some arches don't define it and that header has: > > > > > > #ifndef USER_PGTABLES_CEILING > > > #define USER_PGTABLES_CEILING 0UL > > > #endif > > > > > > ... > > > > > > #ifndef FIRST_USER_ADDRESS > > > #define FIRST_USER_ADDRESS 0UL > > > #endif > > But the macro definitions are enclosed by '#ifdef CONFIG_MMU'. I have > !CONFIG_MMU build test, which shows similar errors, even after Lorenzo's > suggestion is applied. Should we move the definitions out of the '#ifdef > CONFIG_MMU', or implement another unmap_all_init() for !CONFIG_MMU case? > > I confirmed a simple version of the first option (moving definitions out of > CONFIG_MMU, in addition to including pgtable.h) like below works at least for > my !CONFIG_MMU test. > Worked for me, thanks. I also unbreaks arm allnoconfig. I usually run that but I must have missed this time. I understand that v3 is in the works. Meanwhile I'll include your patch to make mm-new a happier place.
Hi Liam,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on linus/master v6.19-rc5 next-20260115]
[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#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Liam-R-Howlett/mm-mmap-Move-exit_mmap-trace-point/20260116-023126
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20260115182720.1691130-9-Liam.Howlett%40oracle.com
patch subject: [PATCH v2 08/10] mm/vma: Use unmap_desc in exit_mmap() and vms_clear_ptes()
config: arm-allnoconfig (https://download.01.org/0day-ci/archive/20260116/202601160919.v3GpIeUh-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260116/202601160919.v3GpIeUh-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601160919.v3GpIeUh-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from mm/filemap.c:54:
In file included from mm/internal.h:23:
>> mm/vma.h:176:18: error: use of undeclared identifier 'USER_PGTABLES_CEILING'
176 | unmap->pg_end = USER_PGTABLES_CEILING;
| ^~~~~~~~~~~~~~~~~~~~~
1 error generated.
vim +/USER_PGTABLES_CEILING +176 mm/vma.h
169
170 static inline void unmap_all_init(struct unmap_desc *unmap,
171 struct vma_iterator *vmi, struct vm_area_struct *vma)
172 {
173 unmap->mas = &vmi->mas;
174 unmap->first = vma;
175 unmap->pg_start = FIRST_USER_ADDRESS;
> 176 unmap->pg_end = USER_PGTABLES_CEILING;
177 unmap->vma_start = 0;
178 unmap->vma_end = ULONG_MAX;
179 unmap->tree_end = ULONG_MAX;
180 unmap->tree_reset = vma->vm_end;
181 unmap->mm_wr_locked = false;
182 }
183
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
* kernel test robot <lkp@intel.com> [260115 20:30]:
> Hi Liam,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on akpm-mm/mm-everything]
> [also build test ERROR on linus/master v6.19-rc5 next-20260115]
> [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#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Liam-R-Howlett/mm-mmap-Move-exit_mmap-trace-point/20260116-023126
> base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link: https://lore.kernel.org/r/20260115182720.1691130-9-Liam.Howlett%40oracle.com
> patch subject: [PATCH v2 08/10] mm/vma: Use unmap_desc in exit_mmap() and vms_clear_ptes()
> config: arm-allnoconfig (https://download.01.org/0day-ci/archive/20260116/202601160919.v3GpIeUh-lkp@intel.com/config)
> compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260116/202601160919.v3GpIeUh-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202601160919.v3GpIeUh-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> In file included from mm/filemap.c:54:
> In file included from mm/internal.h:23:
> >> mm/vma.h:176:18: error: use of undeclared identifier 'USER_PGTABLES_CEILING'
> 176 | unmap->pg_end = USER_PGTABLES_CEILING;
> | ^~~~~~~~~~~~~~~~~~~~~
> 1 error generated.
>
>
> vim +/USER_PGTABLES_CEILING +176 mm/vma.h
>
> 169
> 170 static inline void unmap_all_init(struct unmap_desc *unmap,
> 171 struct vma_iterator *vmi, struct vm_area_struct *vma)
> 172 {
> 173 unmap->mas = &vmi->mas;
> 174 unmap->first = vma;
> 175 unmap->pg_start = FIRST_USER_ADDRESS;
> > 176 unmap->pg_end = USER_PGTABLES_CEILING;
> 177 unmap->vma_start = 0;
> 178 unmap->vma_end = ULONG_MAX;
> 179 unmap->tree_end = ULONG_MAX;
> 180 unmap->tree_reset = vma->vm_end;
> 181 unmap->mm_wr_locked = false;
> 182 }
> 183
>
#syzbot test
--- a/mm/vma_internal.h
+++ b/mm/vma_internal.h
@@ -46,6 +46,7 @@
#include <linux/swap.h>
#include <linux/uprobes.h>
#include <linux/userfaultfd_k.h>
+#include <linux/pgtable.h>
#include <asm/current.h>
#include <asm/tlb.h>
* Liam R. Howlett <Liam.Howlett@oracle.com> [260116 12:55]:
> * kernel test robot <lkp@intel.com> [260115 20:30]:
> > Hi Liam,
> >
> > kernel test robot noticed the following build errors:
> >
> > [auto build test ERROR on akpm-mm/mm-everything]
> > [also build test ERROR on linus/master v6.19-rc5 next-20260115]
> > [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#_base_tree_information]
> >
> > url: https://github.com/intel-lab-lkp/linux/commits/Liam-R-Howlett/mm-mmap-Move-exit_mmap-trace-point/20260116-023126
> > base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> > patch link: https://lore.kernel.org/r/20260115182720.1691130-9-Liam.Howlett%40oracle.com
> > patch subject: [PATCH v2 08/10] mm/vma: Use unmap_desc in exit_mmap() and vms_clear_ptes()
> > config: arm-allnoconfig (https://download.01.org/0day-ci/archive/20260116/202601160919.v3GpIeUh-lkp@intel.com/config)
> > compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
> > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260116/202601160919.v3GpIeUh-lkp@intel.com/reproduce)
> >
> > If you fix the issue in a separate patch/commit (i.e. not just a new version of
> > the same patch/commit), kindly add following tags
> > | Reported-by: kernel test robot <lkp@intel.com>
> > | Closes: https://lore.kernel.org/oe-kbuild-all/202601160919.v3GpIeUh-lkp@intel.com/
> >
> > All errors (new ones prefixed by >>):
> >
> > In file included from mm/filemap.c:54:
> > In file included from mm/internal.h:23:
> > >> mm/vma.h:176:18: error: use of undeclared identifier 'USER_PGTABLES_CEILING'
> > 176 | unmap->pg_end = USER_PGTABLES_CEILING;
> > | ^~~~~~~~~~~~~~~~~~~~~
> > 1 error generated.
> >
> >
> > vim +/USER_PGTABLES_CEILING +176 mm/vma.h
> >
> > 169
> > 170 static inline void unmap_all_init(struct unmap_desc *unmap,
> > 171 struct vma_iterator *vmi, struct vm_area_struct *vma)
> > 172 {
> > 173 unmap->mas = &vmi->mas;
> > 174 unmap->first = vma;
> > 175 unmap->pg_start = FIRST_USER_ADDRESS;
> > > 176 unmap->pg_end = USER_PGTABLES_CEILING;
> > 177 unmap->vma_start = 0;
> > 178 unmap->vma_end = ULONG_MAX;
> > 179 unmap->tree_end = ULONG_MAX;
> > 180 unmap->tree_reset = vma->vm_end;
> > 181 unmap->mm_wr_locked = false;
> > 182 }
> > 183
> >
>
syz test: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
--- a/mm/vma_internal.h
+++ b/mm/vma_internal.h
@@ -46,6 +46,7 @@
#include <linux/swap.h>
#include <linux/uprobes.h>
#include <linux/userfaultfd_k.h>
+#include <linux/pgtable.h>
#include <asm/current.h>
#include <asm/tlb.h>
© 2016 - 2026 Red Hat, Inc.