[PATCH] fix

From: Lorenzo Stoakes
Date: Mon Nov 10 2025 - 16:11:52 EST


Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx>
---
include/linux/leafops.h | 4 ++--
mm/swapfile.c | 12 ++++++++++--
2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/include/linux/leafops.h b/include/linux/leafops.h
index a464a7e08c76..c4cd36760ea0 100644
--- a/include/linux/leafops.h
+++ b/include/linux/leafops.h
@@ -56,7 +56,7 @@ static inline softleaf_t softleaf_from_pte(pte_t pte)
{
softleaf_t arch_entry;

- if (pte_present(pte))
+ if (pte_present(pte) || pte_none(pte))
return softleaf_mk_none();

pte = pte_swp_clear_flags(pte);
@@ -95,7 +95,7 @@ static inline softleaf_t softleaf_from_pmd(pmd_t pmd)
{
softleaf_t arch_entry;

- if (pmd_present(pmd))
+ if (pmd_present(pmd) || pmd_none(pmd))
return softleaf_mk_none();

if (pmd_swp_soft_dirty(pmd))
diff --git a/mm/swapfile.c b/mm/swapfile.c
index fd23d9f7ae10..f0dcf261f652 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -3202,9 +3202,17 @@ static int claim_swapfile(struct swap_info_struct *si, struct inode *inode)
*/
unsigned long generic_max_swapfile_size(void)
{
- const softleaf_t entry = swp_entry(0, ~0UL);
+ softleaf_t entry = swp_entry(0, ~0UL);
+ const pte_t pte = softleaf_to_pte(entry);

- return swp_offset(softleaf_from_pte(softleaf_to_pte(entry))) + 1;
+ /*
+ * Since the PTE can be an invalid swap entry (i.e. the none PTE), we do
+ * this manually.
+ */
+ entry = __pte_to_swp_entry(pte);
+ entry = swp_entry(__swp_type(entry), __swp_offset(entry));
+
+ return swp_offset(entry) + 1;
}

/* Can be overridden by an architecture for additional checks. */
--
2.51.0