Re: [PATCH mm-new 2/3] mm: clean up and expose is_guard_pte_marker()

From: Lance Yang

Date: Mon Sep 15 2025 - 10:27:01 EST


Hi Lorenzo,

Thanks for taking time to review!

On 2025/9/15 21:54, Lorenzo Stoakes wrote:
On Sun, Sep 14, 2025 at 10:35:46PM +0800, Lance Yang wrote:
From: Lance Yang <lance.yang@xxxxxxxxx>

is_guard_pte_marker() performs a redundant check because it calls both
is_pte_marker() and is_guard_swp_entry(), both of which internally check
for a PTE marker.

is_guard_pte_marker()
|- is_pte_marker()
| `- is_pte_marker_entry() // First check
`- is_guard_swp_entry()
`- is_pte_marker_entry() // Second, redundant check


I mean, it expands to:

is_swap_pte(pte) && is_pte_marker_entry(pte_to_swp_entry(pte)) &&
is_pte_marker_entry(pte_to_swp_entry(pte))

Yes, that's a much clearer way to lay it out ;)


So I don't think it's really unreasonable to expect compiler magic here...

But you're right that I should have just used is_swap_pte() really, it's a bit
silly not to, so this is fine :)

Exactly. Glad we're on the same page!


While a modern compiler could likely optimize this away, let's have clean
code and not rely on it ;)

Please don't put smileys in commit messages :) as cute as they are, this is
going on the permanent kernel record and while we all love them, it's
probably not the best place to put them :P


Also, make it available for hugepage collapsing code.

Nit but put a newline after this.

Got it. Will fix up all nits in v2.


I think probably if I'm really really nitty I'd say that you should put
this bit first, as it's the primary motivation for the change, and put the
refactoring stuff after.

Ah, right. The motivation for exposing the helper should come first. I'll
reorder this changelog in v2.


Cc: Kairui Song <kasong@xxxxxxxxxxx>
Signed-off-by: Lance Yang <lance.yang@xxxxxxxxx>

This seems fine to me, so:

Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx>

Thanks,
Lance


---
include/linux/swapops.h | 6 ++++++
mm/madvise.c | 6 ------
2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/include/linux/swapops.h b/include/linux/swapops.h
index 59c5889a4d54..7f5684fa043b 100644
--- a/include/linux/swapops.h
+++ b/include/linux/swapops.h
@@ -469,6 +469,12 @@ static inline int is_guard_swp_entry(swp_entry_t entry)
(pte_marker_get(entry) & PTE_MARKER_GUARD);
}

+static inline bool is_guard_pte_marker(pte_t ptent)
+{
+ return is_swap_pte(ptent) &&
+ is_guard_swp_entry(pte_to_swp_entry(ptent));
+}
+
/*
* This is a special version to check pte_none() just to cover the case when
* the pte is a pte marker. It existed because in many cases the pte marker
diff --git a/mm/madvise.c b/mm/madvise.c
index 35ed4ab0d7c5..bd46e6788fac 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -1069,12 +1069,6 @@ static bool is_valid_guard_vma(struct vm_area_struct *vma, bool allow_locked)
return !(vma->vm_flags & disallowed);
}

-static bool is_guard_pte_marker(pte_t ptent)
-{
- return is_pte_marker(ptent) &&
- is_guard_swp_entry(pte_to_swp_entry(ptent));
-}
-
static int guard_install_pud_entry(pud_t *pud, unsigned long addr,
unsigned long next, struct mm_walk *walk)
{
--
2.49.0