* [PATCH 1/1] mm/page_table_check: widen map counters
[not found] <cover.1784337674.git.roxy520tt@gmail.com>
@ 2026-07-18 4:27 ` Ren Wei
2026-07-18 5:11 ` Andrew Morton
2026-07-18 5:17 ` Matthew Wilcox
0 siblings, 2 replies; 6+ messages in thread
From: Ren Wei @ 2026-07-18 4:27 UTC (permalink / raw)
To: linux-mm; +Cc: pasha.tatashin, akpm, vega, roxy520tt, enjou1224z
From: Zhiling Zou <roxy520tt@gmail.com>
page_table_check_set() and page_table_check_clear() store per-page
anonymous and file map counts in signed atomic_t counters. A page can
have more than INT_MAX read-only mappings while still being mapped
legally.
The global zero page is one example: repeated read faults on private
anonymous mappings install read-only PTEs that are accounted as file
mappings. Once file_map_count wraps, the next set or clear observes a
negative count and trips BUG_ON(), allowing an unprivileged user to panic
a kernel with CONFIG_PAGE_TABLE_CHECK enabled.
Use atomic64_t for both counters so page_table_check can keep the same
type-conflict checks without overflowing at INT_MAX mappings.
Fixes: df4e817b7108 ("mm: page table check")
Cc: stable@vger.kernel.org
Reported-by: Vega <vega@nebusec.ai>
Assisted-by: Codex:gpt-5.4
Signed-off-by: Zhiling Zou <roxy520tt@gmail.com>
Reviewed-by: Ren Wei <enjou1224z@gmail.com>
---
mm/page_table_check.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/mm/page_table_check.c b/mm/page_table_check.c
index 53a8997ec043..edd9d9edf6fc 100644
--- a/mm/page_table_check.c
+++ b/mm/page_table_check.c
@@ -14,8 +14,8 @@
#define pr_fmt(fmt) "page_table_check: " fmt
struct page_table_check {
- atomic_t anon_map_count;
- atomic_t file_map_count;
+ atomic64_t anon_map_count;
+ atomic64_t file_map_count;
};
static bool __page_table_check_enabled __initdata =
@@ -79,11 +79,11 @@ static void page_table_check_clear(unsigned long pfn, unsigned long pgcnt)
struct page_table_check *ptc = get_page_table_check(page_ext);
if (anon) {
- BUG_ON(atomic_read(&ptc->file_map_count));
- BUG_ON(atomic_dec_return(&ptc->anon_map_count) < 0);
+ BUG_ON(atomic64_read(&ptc->file_map_count));
+ BUG_ON(atomic64_dec_return(&ptc->anon_map_count) < 0);
} else {
- BUG_ON(atomic_read(&ptc->anon_map_count));
- BUG_ON(atomic_dec_return(&ptc->file_map_count) < 0);
+ BUG_ON(atomic64_read(&ptc->anon_map_count));
+ BUG_ON(atomic64_dec_return(&ptc->file_map_count) < 0);
}
}
rcu_read_unlock();
@@ -114,11 +114,11 @@ static void page_table_check_set(unsigned long pfn, unsigned long pgcnt,
struct page_table_check *ptc = get_page_table_check(page_ext);
if (anon) {
- BUG_ON(atomic_read(&ptc->file_map_count));
- BUG_ON(atomic_inc_return(&ptc->anon_map_count) > 1 && rw);
+ BUG_ON(atomic64_read(&ptc->file_map_count));
+ BUG_ON(atomic64_inc_return(&ptc->anon_map_count) > 1 && rw);
} else {
- BUG_ON(atomic_read(&ptc->anon_map_count));
- BUG_ON(atomic_inc_return(&ptc->file_map_count) < 0);
+ BUG_ON(atomic64_read(&ptc->anon_map_count));
+ BUG_ON(atomic64_inc_return(&ptc->file_map_count) < 0);
}
}
rcu_read_unlock();
@@ -139,8 +139,8 @@ void __page_table_check_zero(struct page *page, unsigned int order)
for_each_page_ext(page, 1 << order, page_ext, iter) {
struct page_table_check *ptc = get_page_table_check(page_ext);
- BUG_ON(atomic_read(&ptc->anon_map_count));
- BUG_ON(atomic_read(&ptc->file_map_count));
+ BUG_ON(atomic64_read(&ptc->anon_map_count));
+ BUG_ON(atomic64_read(&ptc->file_map_count));
}
rcu_read_unlock();
}
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] mm/page_table_check: widen map counters
2026-07-18 4:27 ` [PATCH 1/1] mm/page_table_check: widen map counters Ren Wei
@ 2026-07-18 5:11 ` Andrew Morton
2026-07-18 5:31 ` Andrew Morton
2026-07-18 5:17 ` Matthew Wilcox
1 sibling, 1 reply; 6+ messages in thread
From: Andrew Morton @ 2026-07-18 5:11 UTC (permalink / raw)
To: Ren Wei
Cc: linux-mm, pasha.tatashin, vega, roxy520tt, Vlastimil Babka,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner
On Sat, 18 Jul 2026 12:27:20 +0800 Ren Wei <enjou1224z@gmail.com> wrote:
> From: Zhiling Zou <roxy520tt@gmail.com>
>
> page_table_check_set() and page_table_check_clear() store per-page
> anonymous and file map counts in signed atomic_t counters. A page can
> have more than INT_MAX read-only mappings while still being mapped
> legally.
>
> The global zero page is one example: repeated read faults on private
> anonymous mappings install read-only PTEs that are accounted as file
> mappings. Once file_map_count wraps, the next set or clear observes a
> negative count and trips BUG_ON(), allowing an unprivileged user to panic
> a kernel with CONFIG_PAGE_TABLE_CHECK enabled.
>
> Use atomic64_t for both counters so page_table_check can keep the same
> type-conflict checks without overflowing at INT_MAX mappings.
Thanks.
> Fixes: df4e817b7108 ("mm: page table check")
> Cc: stable@vger.kernel.org
>
> ...
>
> index 53a8997ec043..edd9d9edf6fc 100644
> --- a/mm/page_table_check.c
> +++ b/mm/page_table_check.c
> @@ -14,8 +14,8 @@
> #define pr_fmt(fmt) "page_table_check: " fmt
>
> struct page_table_check {
> - atomic_t anon_map_count;
> - atomic_t file_map_count;
> + atomic64_t anon_map_count;
> + atomic64_t file_map_count;
> };
AI review suggest this might cause problems in, of all places, page_ext.c:
https://sashiko.dev/#/patchset/b4414b588418c52a99d959d35a40e064ae8b6e72.1784337674.git.roxy520tt@gmail.com
My googling indicates that a 64-bit atomic op on a 32-bit-aligned
address is probably usually OK, but it doesn't sound smart.
Probably adding __aligned(sizeof(atomic64_t)) will address?
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] mm/page_table_check: widen map counters
2026-07-18 4:27 ` [PATCH 1/1] mm/page_table_check: widen map counters Ren Wei
2026-07-18 5:11 ` Andrew Morton
@ 2026-07-18 5:17 ` Matthew Wilcox
1 sibling, 0 replies; 6+ messages in thread
From: Matthew Wilcox @ 2026-07-18 5:17 UTC (permalink / raw)
To: Ren Wei; +Cc: linux-mm, pasha.tatashin, akpm, vega, roxy520tt
On Sat, Jul 18, 2026 at 12:27:20PM +0800, Ren Wei wrote:
> page_table_check_set() and page_table_check_clear() store per-page
> anonymous and file map counts in signed atomic_t counters. A page can
> have more than INT_MAX read-only mappings while still being mapped
> legally.
No it can't. mapcount is 32-bit.
> The global zero page is one example: repeated read faults on private
You mean "is a special case". page_table_check should handle this
case specially.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] mm/page_table_check: widen map counters
2026-07-18 5:11 ` Andrew Morton
@ 2026-07-18 5:31 ` Andrew Morton
2026-07-18 10:21 ` tt roxy
0 siblings, 1 reply; 6+ messages in thread
From: Andrew Morton @ 2026-07-18 5:31 UTC (permalink / raw)
To: Ren Wei, linux-mm, pasha.tatashin, vega, roxy520tt,
Vlastimil Babka, Suren Baghdasaryan, Michal Hocko,
Brendan Jackman, Johannes Weiner
On Fri, 17 Jul 2026 22:11:08 -0700 Andrew Morton <akpm@linux-foundation.org> wrote:
> Probably adding __aligned(sizeof(atomic64_t)) will address?
err, no. I think page_ext code will need alteration for this.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] mm/page_table_check: widen map counters
2026-07-18 5:31 ` Andrew Morton
@ 2026-07-18 10:21 ` tt roxy
2026-07-19 15:20 ` Pasha Tatashin
0 siblings, 1 reply; 6+ messages in thread
From: tt roxy @ 2026-07-18 10:21 UTC (permalink / raw)
To: Andrew Morton
Cc: Ren Wei, linux-mm, pasha.tatashin, vega, Vlastimil Babka,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner
On Sat, Jul 18, 2026 at 1:31 PM Andrew Morton <akpm@linux-foundation.org> wrote:
>
> On Fri, 17 Jul 2026 22:11:08 -0700 Andrew Morton <akpm@linux-foundation.org> wrote:
>
> > Probably adding __aligned(sizeof(atomic64_t)) will address?
>
> err, no. I think page_ext code will need alteration for this.
Thanks Andrew and Matthew.
Agreed. Widening the counters is not the right direction: it changes the
page_ext storage/alignment requirements, and normal page mapcount is still
32-bit as Matthew pointed out.
I'll rework this around a zero-page-specific fix and send v2 after checking
the exact page_table_check paths.
Thanks for the review.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] mm/page_table_check: widen map counters
2026-07-18 10:21 ` tt roxy
@ 2026-07-19 15:20 ` Pasha Tatashin
0 siblings, 0 replies; 6+ messages in thread
From: Pasha Tatashin @ 2026-07-19 15:20 UTC (permalink / raw)
To: tt roxy
Cc: Andrew Morton, Ren Wei, linux-mm, pasha.tatashin, vega,
Vlastimil Babka, Suren Baghdasaryan, Michal Hocko,
Brendan Jackman, Johannes Weiner
On 07-18 18:21, tt roxy wrote:
> On Sat, Jul 18, 2026 at 1:31 PM Andrew Morton <akpm@linux-foundation.org> wrote:
> >
> > On Fri, 17 Jul 2026 22:11:08 -0700 Andrew Morton <akpm@linux-foundation.org> wrote:
> >
> > > Probably adding __aligned(sizeof(atomic64_t)) will address?
> >
> > err, no. I think page_ext code will need alteration for this.
>
> Thanks Andrew and Matthew.
>
> Agreed. Widening the counters is not the right direction: it changes the
> page_ext storage/alignment requirements, and normal page mapcount is still
> 32-bit as Matthew pointed out.
Also, double page table check overhead. So, I agree let's address the
special case instead of widening page_ext.
Thanks,
Pasha
>
> I'll rework this around a zero-page-specific fix and send v2 after checking
> the exact page_table_check paths.
>
> Thanks for the review.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-07-19 15:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <cover.1784337674.git.roxy520tt@gmail.com>
2026-07-18 4:27 ` [PATCH 1/1] mm/page_table_check: widen map counters Ren Wei
2026-07-18 5:11 ` Andrew Morton
2026-07-18 5:31 ` Andrew Morton
2026-07-18 10:21 ` tt roxy
2026-07-19 15:20 ` Pasha Tatashin
2026-07-18 5:17 ` Matthew Wilcox
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox