* [PATCH 0/9] Convert x86 pgd_lists to ptdescs
@ 2026-05-27 14:03 Vishal Moola
2026-05-27 14:03 ` [PATCH 1/9] x86/mm/pat: Use IS_ENABLED() instead of ifdef Vishal Moola
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
This continues the ptdesc conversions for x86[1]. This is a necessary step
in preparation for the separate allocation of ptdescs from struct page.
Once ptdescs are not wrappers, the pgd_list should be used to find our
ptdesc, not page.
In fact, after patch 4 we can successfully boot a 32-bit x86 kernel
that separately allocates ptdescs.
All of the patches are rather straightforward, I just kept them split up
for ease of review. There are no intended functional changes as ptdescs
are currently still wrappers around struct page.
[1] https://lore.kernel.org/linux-mm/20260211195233.368497-1-vishal.moola@gmail.com/
----------------
I've compiled and booted both 64 and 32 bit on a kernel with separately
allocated ptdescs. I ensured the codepaths were hit for all the changes
except Xen.
This applies cleanly to the tip bot. I'm thinking this can go through
Dave's mm.
Vishal Moola (9):
x86/mm/pat: Use IS_ENABLED() instead of ifdef
x86/mm/pat: Convert __set_pmd_pte() to ptdescs
x86/mm/pat: Convert collapse_pmd_page() to ptdescs
x86/mm: Convert arch_sync_kernel_mappings() to ptdescs
x86/mm: Convert sync_global_pgds_l5() to ptdescs
x86/mm: Convert sync_global_pgds_l4() to ptdescs
x86/mm: Convert pgd_page_get_mm() to ptdescs
x86/xen: Convert xen_mm_pin_all() to ptdescs
x86/xen: Convert xen_mm_unpin_all() to ptdescs
arch/x86/include/asm/pgtable.h | 2 +-
arch/x86/include/asm/pgtable_types.h | 2 +-
arch/x86/mm/fault.c | 8 ++++----
arch/x86/mm/init_64.c | 16 ++++++++--------
arch/x86/mm/pat/set_memory.c | 17 ++++++++---------
arch/x86/mm/pgtable.c | 4 ++--
arch/x86/xen/mmu_pv.c | 22 +++++++++++-----------
7 files changed, 35 insertions(+), 36 deletions(-)
--
2.54.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/9] x86/mm/pat: Use IS_ENABLED() instead of ifdef
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-27 14:03 ` [PATCH 2/9] x86/mm/pat: Convert __set_pmd_pte() to ptdescs Vishal Moola
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Use IS_ENABLED() to check if we are on 32 bit. This standardizes this
check with the other 32 bit check in the file. No functional changes.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/mm/pat/set_memory.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c
index d023a40a1e03..3b9032a3f315 100644
--- a/arch/x86/mm/pat/set_memory.c
+++ b/arch/x86/mm/pat/set_memory.c
@@ -888,8 +888,8 @@ static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte)
{
/* change init_mm */
set_pte_atomic(kpte, pte);
-#ifdef CONFIG_X86_32
- {
+
+ if (IS_ENABLED(CONFIG_X86_32)) {
struct page *page;
list_for_each_entry(page, &pgd_list, lru) {
@@ -905,7 +905,6 @@ static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte)
set_pte_atomic((pte_t *)pmd, pte);
}
}
-#endif
}
static pgprot_t pgprot_clear_protnone_bits(pgprot_t prot)
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/9] x86/mm/pat: Convert __set_pmd_pte() to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
2026-05-27 14:03 ` [PATCH 1/9] x86/mm/pat: Use IS_ENABLED() instead of ifdef Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-27 14:03 ` [PATCH 3/9] x86/mm/pat: Convert collapse_pmd_page() " Vishal Moola
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Convert __set_pmd_pte() to ptdescs in preparation for the eventual
splitting of ptdescs from struct page.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/mm/pat/set_memory.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c
index 3b9032a3f315..93cb71451ce2 100644
--- a/arch/x86/mm/pat/set_memory.c
+++ b/arch/x86/mm/pat/set_memory.c
@@ -890,15 +890,15 @@ static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte)
set_pte_atomic(kpte, pte);
if (IS_ENABLED(CONFIG_X86_32)) {
- struct page *page;
+ struct ptdesc *ptdesc;
- list_for_each_entry(page, &pgd_list, lru) {
+ list_for_each_entry(ptdesc, &pgd_list, pt_list) {
pgd_t *pgd;
p4d_t *p4d;
pud_t *pud;
pmd_t *pmd;
- pgd = (pgd_t *)page_address(page) + pgd_index(address);
+ pgd = (pgd_t *)ptdesc_address(ptdesc) + pgd_index(address);
p4d = p4d_offset(pgd, address);
pud = pud_offset(p4d, address);
pmd = pmd_offset(pud, address);
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/9] x86/mm/pat: Convert collapse_pmd_page() to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
2026-05-27 14:03 ` [PATCH 1/9] x86/mm/pat: Use IS_ENABLED() instead of ifdef Vishal Moola
2026-05-27 14:03 ` [PATCH 2/9] x86/mm/pat: Convert __set_pmd_pte() to ptdescs Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-27 14:03 ` [PATCH 4/9] x86/mm: Convert arch_sync_kernel_mappings() " Vishal Moola
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Convert collapse_pmd_page() to ptdescs in preparation for the
eventual splitting of ptdescs from struct page.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/mm/pat/set_memory.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c
index 93cb71451ce2..45623d4c24c9 100644
--- a/arch/x86/mm/pat/set_memory.c
+++ b/arch/x86/mm/pat/set_memory.c
@@ -1297,11 +1297,11 @@ static int collapse_pmd_page(pmd_t *pmd, unsigned long addr,
list_add(&page_ptdesc(pmd_page(old_pmd))->pt_list, pgtables);
if (IS_ENABLED(CONFIG_X86_32)) {
- struct page *page;
+ struct ptdesc *ptdesc;
/* Update all PGD tables to use the same large page */
- list_for_each_entry(page, &pgd_list, lru) {
- pgd_t *pgd = (pgd_t *)page_address(page) + pgd_index(addr);
+ list_for_each_entry(ptdesc, &pgd_list, pt_list) {
+ pgd_t *pgd = (pgd_t *)ptdesc_address(ptdesc) + pgd_index(addr);
p4d_t *p4d = p4d_offset(pgd, addr);
pud_t *pud = pud_offset(p4d, addr);
pmd_t *pmd = pmd_offset(pud, addr);
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/9] x86/mm: Convert arch_sync_kernel_mappings() to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
` (2 preceding siblings ...)
2026-05-27 14:03 ` [PATCH 3/9] x86/mm/pat: Convert collapse_pmd_page() " Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-27 14:03 ` [PATCH 5/9] x86/mm: Convert sync_global_pgds_l5() " Vishal Moola
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Convert arch_sync_kernel_mappings() to ptdescs in preparation for
the eventual splitting of ptdescs from struct page.
Following this patch, we can successfully boot a 32-bit x86 kernel with
separately allocated ptdescs.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/mm/fault.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 63de8e8684f2..6c72d6668416 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -269,17 +269,17 @@ void arch_sync_kernel_mappings(unsigned long start, unsigned long end)
for (addr = start & PMD_MASK;
addr >= TASK_SIZE_MAX && addr < VMALLOC_END;
addr += PMD_SIZE) {
- struct page *page;
+ struct ptdesc *ptdesc;
spin_lock(&pgd_lock);
- list_for_each_entry(page, &pgd_list, lru) {
+ list_for_each_entry(ptdesc, &pgd_list, pt_list) {
spinlock_t *pgt_lock;
/* the pgt_lock only for Xen */
- pgt_lock = &pgd_page_get_mm(page)->page_table_lock;
+ pgt_lock = &pgd_page_get_mm(ptdesc_page(ptdesc))->page_table_lock;
spin_lock(pgt_lock);
- vmalloc_sync_one(page_address(page), addr);
+ vmalloc_sync_one(ptdesc_address(ptdesc), addr);
spin_unlock(pgt_lock);
}
spin_unlock(&pgd_lock);
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/9] x86/mm: Convert sync_global_pgds_l5() to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
` (3 preceding siblings ...)
2026-05-27 14:03 ` [PATCH 4/9] x86/mm: Convert arch_sync_kernel_mappings() " Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-27 14:03 ` [PATCH 6/9] x86/mm: Convert sync_global_pgds_l4() " Vishal Moola
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Convert sync_global_pgds_l5() to ptdescs in preparation for the
eventual splitting of ptdescs from struct page.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/mm/init_64.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index df27379d4bb4..e89b51aea2cf 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -136,7 +136,7 @@ static void sync_global_pgds_l5(unsigned long start, unsigned long end)
for (addr = start; addr <= end; addr = ALIGN(addr + 1, PGDIR_SIZE)) {
const pgd_t *pgd_ref = pgd_offset_k(addr);
- struct page *page;
+ struct ptdesc *ptdesc;
/* Check for overflow */
if (addr < start)
@@ -146,13 +146,13 @@ static void sync_global_pgds_l5(unsigned long start, unsigned long end)
continue;
spin_lock(&pgd_lock);
- list_for_each_entry(page, &pgd_list, lru) {
+ list_for_each_entry(ptdesc, &pgd_list, pt_list) {
pgd_t *pgd;
spinlock_t *pgt_lock;
- pgd = (pgd_t *)page_address(page) + pgd_index(addr);
+ pgd = (pgd_t *)ptdesc_address(ptdesc) + pgd_index(addr);
/* the pgt_lock only for Xen */
- pgt_lock = &pgd_page_get_mm(page)->page_table_lock;
+ pgt_lock = &pgd_page_get_mm(ptdesc_page(ptdesc))->page_table_lock;
spin_lock(pgt_lock);
if (!pgd_none(*pgd_ref) && !pgd_none(*pgd))
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 6/9] x86/mm: Convert sync_global_pgds_l4() to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
` (4 preceding siblings ...)
2026-05-27 14:03 ` [PATCH 5/9] x86/mm: Convert sync_global_pgds_l5() " Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-27 14:03 ` [PATCH 7/9] x86/mm: Convert pgd_page_get_mm() " Vishal Moola
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Convert sync_global_pgds_l4() to ptdescs in preparation for the
eventual splitting of ptdescs from struct page.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/mm/init_64.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index e89b51aea2cf..a6ccb83f2d26 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -174,7 +174,7 @@ static void sync_global_pgds_l4(unsigned long start, unsigned long end)
for (addr = start; addr <= end; addr = ALIGN(addr + 1, PGDIR_SIZE)) {
pgd_t *pgd_ref = pgd_offset_k(addr);
const p4d_t *p4d_ref;
- struct page *page;
+ struct ptdesc *ptdesc;
/*
* With folded p4d, pgd_none() is always false, we need to
@@ -187,15 +187,15 @@ static void sync_global_pgds_l4(unsigned long start, unsigned long end)
continue;
spin_lock(&pgd_lock);
- list_for_each_entry(page, &pgd_list, lru) {
+ list_for_each_entry(ptdesc, &pgd_list, pt_list) {
pgd_t *pgd;
p4d_t *p4d;
spinlock_t *pgt_lock;
- pgd = (pgd_t *)page_address(page) + pgd_index(addr);
+ pgd = (pgd_t *)ptdesc_address(ptdesc) + pgd_index(addr);
p4d = p4d_offset(pgd, addr);
/* the pgt_lock only for Xen */
- pgt_lock = &pgd_page_get_mm(page)->page_table_lock;
+ pgt_lock = &pgd_page_get_mm(ptdesc_page(ptdesc))->page_table_lock;
spin_lock(pgt_lock);
if (!p4d_none(*p4d_ref) && !p4d_none(*p4d))
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 7/9] x86/mm: Convert pgd_page_get_mm() to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
` (5 preceding siblings ...)
2026-05-27 14:03 ` [PATCH 6/9] x86/mm: Convert sync_global_pgds_l4() " Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-27 14:03 ` [PATCH 8/9] x86/xen: Convert xen_mm_pin_all() " Vishal Moola
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Convert pgd_page_get_mm() to ptdescs. Define struct ptdesc in our
pgtable_types so that our declarations recognize ptdesc as an
appropriate page table type.
Now that all callers are using ptdescs, we can pass in that
ptdesc to get the underlying mm_struct.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/include/asm/pgtable.h | 2 +-
arch/x86/include/asm/pgtable_types.h | 2 +-
arch/x86/mm/fault.c | 2 +-
arch/x86/mm/init_64.c | 4 ++--
arch/x86/mm/pgtable.c | 4 ++--
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
index 2187e9cfcefa..20e8a6ddd2df 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -50,7 +50,7 @@ void ptdump_walk_user_pgd_level_checkwx(void);
extern spinlock_t pgd_lock;
extern struct list_head pgd_list;
-extern struct mm_struct *pgd_page_get_mm(struct page *page);
+struct mm_struct *pgd_page_get_mm(struct ptdesc *pt);
extern pmdval_t early_pmd_flags;
diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h
index 2ec250ba467e..95c7f453db17 100644
--- a/arch/x86/include/asm/pgtable_types.h
+++ b/arch/x86/include/asm/pgtable_types.h
@@ -512,7 +512,7 @@ static inline pgprot_t pgprot_large_2_4k(pgprot_t pgprot)
return __pgprot(protval_large_2_4k(pgprot_val(pgprot)));
}
-
+struct ptdesc;
typedef struct page *pgtable_t;
extern pteval_t __supported_pte_mask;
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 6c72d6668416..4d78c78a0bcc 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -276,7 +276,7 @@ void arch_sync_kernel_mappings(unsigned long start, unsigned long end)
spinlock_t *pgt_lock;
/* the pgt_lock only for Xen */
- pgt_lock = &pgd_page_get_mm(ptdesc_page(ptdesc))->page_table_lock;
+ pgt_lock = &pgd_page_get_mm(ptdesc)->page_table_lock;
spin_lock(pgt_lock);
vmalloc_sync_one(ptdesc_address(ptdesc), addr);
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index a6ccb83f2d26..a49be75dd713 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -152,7 +152,7 @@ static void sync_global_pgds_l5(unsigned long start, unsigned long end)
pgd = (pgd_t *)ptdesc_address(ptdesc) + pgd_index(addr);
/* the pgt_lock only for Xen */
- pgt_lock = &pgd_page_get_mm(ptdesc_page(ptdesc))->page_table_lock;
+ pgt_lock = &pgd_page_get_mm(ptdesc)->page_table_lock;
spin_lock(pgt_lock);
if (!pgd_none(*pgd_ref) && !pgd_none(*pgd))
@@ -195,7 +195,7 @@ static void sync_global_pgds_l4(unsigned long start, unsigned long end)
pgd = (pgd_t *)ptdesc_address(ptdesc) + pgd_index(addr);
p4d = p4d_offset(pgd, addr);
/* the pgt_lock only for Xen */
- pgt_lock = &pgd_page_get_mm(ptdesc_page(ptdesc))->page_table_lock;
+ pgt_lock = &pgd_page_get_mm(ptdesc)->page_table_lock;
spin_lock(pgt_lock);
if (!p4d_none(*p4d_ref) && !p4d_none(*p4d))
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
index da7f0a03cf90..070e3d310eca 100644
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -74,9 +74,9 @@ static void pgd_set_mm(pgd_t *pgd, struct mm_struct *mm)
virt_to_ptdesc(pgd)->pt_mm = mm;
}
-struct mm_struct *pgd_page_get_mm(struct page *page)
+struct mm_struct *pgd_page_get_mm(struct ptdesc *pt)
{
- return page_ptdesc(page)->pt_mm;
+ return pt->pt_mm;
}
static void pgd_ctor(struct mm_struct *mm, pgd_t *pgd)
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 8/9] x86/xen: Convert xen_mm_pin_all() to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
` (6 preceding siblings ...)
2026-05-27 14:03 ` [PATCH 7/9] x86/mm: Convert pgd_page_get_mm() " Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-27 14:03 ` [PATCH 9/9] x86/xen: Convert xen_mm_unpin_all() " Vishal Moola
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Convert xen_mm_pin_all() to ptdescs in preparation for the eventual
splitting of ptdescs from struct page. Continue checking PagePinned
through the underlying page as we do not have a per-memdesc api for
page flags yet.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/xen/mmu_pv.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
index 3eee5f84f8a7..b2f6e7b7c545 100644
--- a/arch/x86/xen/mmu_pv.c
+++ b/arch/x86/xen/mmu_pv.c
@@ -828,15 +828,15 @@ static void xen_pgd_pin(struct mm_struct *mm)
*/
void xen_mm_pin_all(void)
{
- struct page *page;
+ struct ptdesc *ptdesc;
spin_lock(&init_mm.page_table_lock);
spin_lock(&pgd_lock);
- list_for_each_entry(page, &pgd_list, lru) {
- if (!PagePinned(page)) {
- __xen_pgd_pin(&init_mm, (pgd_t *)page_address(page));
- SetPageSavePinned(page);
+ list_for_each_entry(ptdesc, &pgd_list, pt_list) {
+ if (!PagePinned(ptdesc_page(ptdesc))) {
+ __xen_pgd_pin(&init_mm, (pgd_t *)ptdesc_address(ptdesc));
+ SetPageSavePinned(ptdesc_page(ptdesc));
}
}
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 9/9] x86/xen: Convert xen_mm_unpin_all() to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
` (7 preceding siblings ...)
2026-05-27 14:03 ` [PATCH 8/9] x86/xen: Convert xen_mm_pin_all() " Vishal Moola
@ 2026-05-27 14:03 ` Vishal Moola
2026-05-28 12:59 ` [PATCH 0/9] Convert x86 pgd_lists " Mike Rapoport
2026-05-28 14:43 ` William Kucharski
10 siblings, 0 replies; 12+ messages in thread
From: Vishal Moola @ 2026-05-27 14:03 UTC (permalink / raw)
To: Dave Hansen, linux-mm, linux-kernel, x86
Cc: Mike Rapoport, Lu Baolu, xen-devel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, H. Peter Anvin, Andy Lutomirski, Peter Zijlstra,
Juergen Gross, Boris Ostrovsky, Vishal Moola
Convert xen_mm_unpin_all() to ptdescs in preparation for the eventual
splitting of ptdescs from struct page. Continue checking PagePinned
through the underlying page as we do not have a per-memdesc api yet.
Signed-off-by: Vishal Moola <vishal.moola@gmail.com>
---
arch/x86/xen/mmu_pv.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
index b2f6e7b7c545..c4731c1e842d 100644
--- a/arch/x86/xen/mmu_pv.c
+++ b/arch/x86/xen/mmu_pv.c
@@ -939,16 +939,16 @@ static void xen_pgd_unpin(struct mm_struct *mm)
*/
void xen_mm_unpin_all(void)
{
- struct page *page;
+ struct ptdesc *ptdesc;
spin_lock(&init_mm.page_table_lock);
spin_lock(&pgd_lock);
- list_for_each_entry(page, &pgd_list, lru) {
- if (PageSavePinned(page)) {
- BUG_ON(!PagePinned(page));
- __xen_pgd_unpin(&init_mm, (pgd_t *)page_address(page));
- ClearPageSavePinned(page);
+ list_for_each_entry(ptdesc, &pgd_list, pt_list) {
+ if (PageSavePinned(ptdesc_page(ptdesc))) {
+ BUG_ON(!PagePinned(ptdesc_page(ptdesc)));
+ __xen_pgd_unpin(&init_mm, (pgd_t *)ptdesc_address(ptdesc));
+ ClearPageSavePinned(ptdesc_page(ptdesc));
}
}
--
2.54.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 0/9] Convert x86 pgd_lists to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
` (8 preceding siblings ...)
2026-05-27 14:03 ` [PATCH 9/9] x86/xen: Convert xen_mm_unpin_all() " Vishal Moola
@ 2026-05-28 12:59 ` Mike Rapoport
2026-05-28 14:43 ` William Kucharski
10 siblings, 0 replies; 12+ messages in thread
From: Mike Rapoport @ 2026-05-28 12:59 UTC (permalink / raw)
To: Vishal Moola
Cc: Dave Hansen, linux-mm, linux-kernel, x86, Lu Baolu, xen-devel,
Thomas Gleixner, Ingo Molnar, Borislav Petkov, H. Peter Anvin,
Andy Lutomirski, Peter Zijlstra, Juergen Gross, Boris Ostrovsky
On Wed, May 27, 2026 at 03:03:07PM +0100, Vishal Moola wrote:
> This continues the ptdesc conversions for x86[1]. This is a necessary step
> in preparation for the separate allocation of ptdescs from struct page.
> Once ptdescs are not wrappers, the pgd_list should be used to find our
> ptdesc, not page.
>
> In fact, after patch 4 we can successfully boot a 32-bit x86 kernel
> that separately allocates ptdescs.
>
> All of the patches are rather straightforward, I just kept them split up
> for ease of review. There are no intended functional changes as ptdescs
> are currently still wrappers around struct page.
Looks straightforward to me indeed :)
Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> [1] https://lore.kernel.org/linux-mm/20260211195233.368497-1-vishal.moola@gmail.com/
>
> ----------------
>
> I've compiled and booted both 64 and 32 bit on a kernel with separately
> allocated ptdescs. I ensured the codepaths were hit for all the changes
> except Xen.
>
> This applies cleanly to the tip bot. I'm thinking this can go through
> Dave's mm.
>
> Vishal Moola (9):
> x86/mm/pat: Use IS_ENABLED() instead of ifdef
> x86/mm/pat: Convert __set_pmd_pte() to ptdescs
> x86/mm/pat: Convert collapse_pmd_page() to ptdescs
> x86/mm: Convert arch_sync_kernel_mappings() to ptdescs
> x86/mm: Convert sync_global_pgds_l5() to ptdescs
> x86/mm: Convert sync_global_pgds_l4() to ptdescs
> x86/mm: Convert pgd_page_get_mm() to ptdescs
> x86/xen: Convert xen_mm_pin_all() to ptdescs
> x86/xen: Convert xen_mm_unpin_all() to ptdescs
>
> arch/x86/include/asm/pgtable.h | 2 +-
> arch/x86/include/asm/pgtable_types.h | 2 +-
> arch/x86/mm/fault.c | 8 ++++----
> arch/x86/mm/init_64.c | 16 ++++++++--------
> arch/x86/mm/pat/set_memory.c | 17 ++++++++---------
> arch/x86/mm/pgtable.c | 4 ++--
> arch/x86/xen/mmu_pv.c | 22 +++++++++++-----------
> 7 files changed, 35 insertions(+), 36 deletions(-)
>
> --
> 2.54.0
>
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0/9] Convert x86 pgd_lists to ptdescs
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
` (9 preceding siblings ...)
2026-05-28 12:59 ` [PATCH 0/9] Convert x86 pgd_lists " Mike Rapoport
@ 2026-05-28 14:43 ` William Kucharski
10 siblings, 0 replies; 12+ messages in thread
From: William Kucharski @ 2026-05-28 14:43 UTC (permalink / raw)
To: Vishal Moola
Cc: Dave Hansen, linux-mm, linux-kernel, x86, Mike Rapoport, Lu Baolu,
xen-devel, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
H. Peter Anvin, Andy Lutomirski, Peter Zijlstra, Juergen Gross,
Boris Ostrovsky
Looks great!
Reviewed-by: William Kucharski <william.kucharski@linux.dev>
> On May 27, 2026, at 08:03, Vishal Moola <vishal.moola@gmail.com> wrote:
>
> This continues the ptdesc conversions for x86[1]. This is a necessary step
> in preparation for the separate allocation of ptdescs from struct page.
> Once ptdescs are not wrappers, the pgd_list should be used to find our
> ptdesc, not page.
>
> In fact, after patch 4 we can successfully boot a 32-bit x86 kernel
> that separately allocates ptdescs.
>
> All of the patches are rather straightforward, I just kept them split up
> for ease of review. There are no intended functional changes as ptdescs
> are currently still wrappers around struct page.
>
> [1] https://lore.kernel.org/linux-mm/20260211195233.368497-1-vishal.moola@gmail.com/
>
> ----------------
>
> I've compiled and booted both 64 and 32 bit on a kernel with separately
> allocated ptdescs. I ensured the codepaths were hit for all the changes
> except Xen.
>
> This applies cleanly to the tip bot. I'm thinking this can go through
> Dave's mm.
>
> Vishal Moola (9):
> x86/mm/pat: Use IS_ENABLED() instead of ifdef
> x86/mm/pat: Convert __set_pmd_pte() to ptdescs
> x86/mm/pat: Convert collapse_pmd_page() to ptdescs
> x86/mm: Convert arch_sync_kernel_mappings() to ptdescs
> x86/mm: Convert sync_global_pgds_l5() to ptdescs
> x86/mm: Convert sync_global_pgds_l4() to ptdescs
> x86/mm: Convert pgd_page_get_mm() to ptdescs
> x86/xen: Convert xen_mm_pin_all() to ptdescs
> x86/xen: Convert xen_mm_unpin_all() to ptdescs
>
> arch/x86/include/asm/pgtable.h | 2 +-
> arch/x86/include/asm/pgtable_types.h | 2 +-
> arch/x86/mm/fault.c | 8 ++++----
> arch/x86/mm/init_64.c | 16 ++++++++--------
> arch/x86/mm/pat/set_memory.c | 17 ++++++++---------
> arch/x86/mm/pgtable.c | 4 ++--
> arch/x86/xen/mmu_pv.c | 22 +++++++++++-----------
> 7 files changed, 35 insertions(+), 36 deletions(-)
>
> --
> 2.54.0
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2026-05-28 14:43 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-27 14:03 [PATCH 0/9] Convert x86 pgd_lists to ptdescs Vishal Moola
2026-05-27 14:03 ` [PATCH 1/9] x86/mm/pat: Use IS_ENABLED() instead of ifdef Vishal Moola
2026-05-27 14:03 ` [PATCH 2/9] x86/mm/pat: Convert __set_pmd_pte() to ptdescs Vishal Moola
2026-05-27 14:03 ` [PATCH 3/9] x86/mm/pat: Convert collapse_pmd_page() " Vishal Moola
2026-05-27 14:03 ` [PATCH 4/9] x86/mm: Convert arch_sync_kernel_mappings() " Vishal Moola
2026-05-27 14:03 ` [PATCH 5/9] x86/mm: Convert sync_global_pgds_l5() " Vishal Moola
2026-05-27 14:03 ` [PATCH 6/9] x86/mm: Convert sync_global_pgds_l4() " Vishal Moola
2026-05-27 14:03 ` [PATCH 7/9] x86/mm: Convert pgd_page_get_mm() " Vishal Moola
2026-05-27 14:03 ` [PATCH 8/9] x86/xen: Convert xen_mm_pin_all() " Vishal Moola
2026-05-27 14:03 ` [PATCH 9/9] x86/xen: Convert xen_mm_unpin_all() " Vishal Moola
2026-05-28 12:59 ` [PATCH 0/9] Convert x86 pgd_lists " Mike Rapoport
2026-05-28 14:43 ` William Kucharski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox