* [PATCH v2 0/6] Account page tables at all levels
@ 2025-01-03 18:44 Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 1/6] mm: Move common part of pagetable_*_ctor to helper Kevin Brodsky
` (7 more replies)
0 siblings, 8 replies; 14+ messages in thread
From: Kevin Brodsky @ 2025-01-03 18:44 UTC (permalink / raw)
To: linux-mm
Cc: Kevin Brodsky, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
v1: https://lore.kernel.org/linux-mm/20241219164425.2277022-1-kevin.brodsky@arm.com/
This series should be considered in conjunction with Qi's series [1].
Together, they ensure that page table ctor/dtor are called at all levels
(PTE to PGD) and all architectures, where page tables are regular pages.
Besides the improvement in accounting and general cleanup, this also
create a single place where construction/destruction hooks can be called
for all page tables, namely the now-generic pagetable_dtor() introduced
by Qi, and __pagetable_ctor() introduced in this series.
v2 is essentially v1 rebased on top of mm-unstable, which includes Qi's
v4 series. A number of patches from v1 were dropped:
* v1 patch 4 is superseded by patch 6 in Qi's series.
* v1 patch 5 and 6 moved to Qi's series from v3 onwards.
* v1 patch 7 is superseded by patch 4 in Qi's series.
Changes from v1 in the remaining patches:
* Patch 1 only introduces __pagetable_ctor() as there is now a single
generic pagetable_dtor().
* Patch 3 and 6: in arch/m68k/mm/motorola.c, free_pointer_table() can
now unconditionally call pagetable_dtor() since it is the same for all
levels.
* Patch 6 just uses pagetable_dtor() instead of introducing
pagetable_pgd_dtor().
* Added Dave Hansen's Acked-by to all patches.
- Kevin
[1] https://lore.kernel.org/linux-mm/cover.1735549103.git.zhengqi.arch@bytedance.com/
---
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: "Mike Rapoport (IBM)" <rppt@kernel.org>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: linux-alpha@vger.kernel.org
Cc: linux-arch@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-csky@vger.kernel.org
Cc: linux-hexagon@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-m68k@lists.linux-m68k.org
Cc: linux-mips@vger.kernel.org
Cc: linux-openrisc@vger.kernel.org
Cc: linux-parisc@vger.kernel.org
Cc: linux-riscv@lists.infradead.org
Cc: linux-s390@vger.kernel.org
Cc: linux-snps-arc@lists.infradead.org
Cc: linux-um@lists.infradead.org
Cc: loongarch@lists.linux.dev
Cc: x86@kernel.org
---
Kevin Brodsky (6):
mm: Move common part of pagetable_*_ctor to helper
parisc: mm: Ensure pagetable_pmd_[cd]tor are called
m68k: mm: Add calls to pagetable_pmd_[cd]tor
ARM: mm: Rename PGD helpers
asm-generic: pgalloc: Provide generic __pgd_{alloc,free}
mm: Introduce ctor/dtor at PGD level
arch/alpha/mm/init.c | 2 +-
arch/arc/include/asm/pgalloc.h | 9 ++----
arch/arm/mm/pgd.c | 16 +++++-----
arch/arm64/mm/pgd.c | 4 +--
arch/csky/include/asm/pgalloc.h | 2 +-
arch/hexagon/include/asm/pgalloc.h | 2 +-
arch/loongarch/mm/pgtable.c | 7 ++---
arch/m68k/include/asm/mcf_pgalloc.h | 3 +-
arch/m68k/include/asm/motorola_pgalloc.h | 6 ++--
arch/m68k/include/asm/sun3_pgalloc.h | 2 +-
arch/m68k/mm/motorola.c | 21 +++++++++----
arch/microblaze/include/asm/pgalloc.h | 7 +----
arch/mips/include/asm/pgalloc.h | 6 ----
arch/mips/mm/pgtable.c | 8 ++---
arch/nios2/mm/pgtable.c | 3 +-
arch/openrisc/include/asm/pgalloc.h | 6 ++--
arch/parisc/include/asm/pgalloc.h | 39 ++++++++----------------
arch/riscv/include/asm/pgalloc.h | 3 +-
arch/s390/include/asm/pgalloc.h | 9 +++++-
arch/um/kernel/mem.c | 7 ++---
arch/x86/mm/pgtable.c | 24 +++++++--------
arch/xtensa/include/asm/pgalloc.h | 2 +-
include/asm-generic/pgalloc.h | 28 ++++++++++++++++-
include/linux/mm.h | 31 ++++++++++---------
24 files changed, 126 insertions(+), 121 deletions(-)
base-commit: e2ce19225db5818f5dc22864cd225f8c425c3775
--
2.47.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 1/6] mm: Move common part of pagetable_*_ctor to helper
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
@ 2025-01-03 18:44 ` Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 2/6] parisc: mm: Ensure pagetable_pmd_[cd]tor are called Kevin Brodsky
` (6 subsequent siblings)
7 siblings, 0 replies; 14+ messages in thread
From: Kevin Brodsky @ 2025-01-03 18:44 UTC (permalink / raw)
To: linux-mm
Cc: Kevin Brodsky, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
pagetable_*_ctor all have the same basic implementation. Move the
common part to a helper to reduce duplication.
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
include/linux/mm.h | 28 ++++++++++++----------------
1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 1a11f9df5c2d..065fa9449d03 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3076,6 +3076,14 @@ static inline bool ptlock_init(struct ptdesc *ptdesc) { return true; }
static inline void ptlock_free(struct ptdesc *ptdesc) {}
#endif /* defined(CONFIG_SPLIT_PTE_PTLOCKS) */
+static inline void __pagetable_ctor(struct ptdesc *ptdesc)
+{
+ struct folio *folio = ptdesc_folio(ptdesc);
+
+ __folio_set_pgtable(folio);
+ lruvec_stat_add_folio(folio, NR_PAGETABLE);
+}
+
static inline void pagetable_dtor(struct ptdesc *ptdesc)
{
struct folio *folio = ptdesc_folio(ptdesc);
@@ -3093,12 +3101,9 @@ static inline void pagetable_dtor_free(struct ptdesc *ptdesc)
static inline bool pagetable_pte_ctor(struct ptdesc *ptdesc)
{
- struct folio *folio = ptdesc_folio(ptdesc);
-
if (!ptlock_init(ptdesc))
return false;
- __folio_set_pgtable(folio);
- lruvec_stat_add_folio(folio, NR_PAGETABLE);
+ __pagetable_ctor(ptdesc);
return true;
}
@@ -3202,13 +3207,10 @@ static inline spinlock_t *pmd_lock(struct mm_struct *mm, pmd_t *pmd)
static inline bool pagetable_pmd_ctor(struct ptdesc *ptdesc)
{
- struct folio *folio = ptdesc_folio(ptdesc);
-
if (!pmd_ptlock_init(ptdesc))
return false;
- __folio_set_pgtable(folio);
ptdesc_pmd_pts_init(ptdesc);
- lruvec_stat_add_folio(folio, NR_PAGETABLE);
+ __pagetable_ctor(ptdesc);
return true;
}
@@ -3233,18 +3235,12 @@ static inline spinlock_t *pud_lock(struct mm_struct *mm, pud_t *pud)
static inline void pagetable_pud_ctor(struct ptdesc *ptdesc)
{
- struct folio *folio = ptdesc_folio(ptdesc);
-
- __folio_set_pgtable(folio);
- lruvec_stat_add_folio(folio, NR_PAGETABLE);
+ __pagetable_ctor(ptdesc);
}
static inline void pagetable_p4d_ctor(struct ptdesc *ptdesc)
{
- struct folio *folio = ptdesc_folio(ptdesc);
-
- __folio_set_pgtable(folio);
- lruvec_stat_add_folio(folio, NR_PAGETABLE);
+ __pagetable_ctor(ptdesc);
}
extern void __init pagecache_init(void);
--
2.47.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 2/6] parisc: mm: Ensure pagetable_pmd_[cd]tor are called
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 1/6] mm: Move common part of pagetable_*_ctor to helper Kevin Brodsky
@ 2025-01-03 18:44 ` Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 3/6] m68k: mm: Add calls to pagetable_pmd_[cd]tor Kevin Brodsky
` (5 subsequent siblings)
7 siblings, 0 replies; 14+ messages in thread
From: Kevin Brodsky @ 2025-01-03 18:44 UTC (permalink / raw)
To: linux-mm
Cc: Kevin Brodsky, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
The implementation of pmd_{alloc_one,free} on parisc requires a
non-zero allocation order, but is completely standard aside from
that. Let's reuse the generic implementation of pmd_alloc_one().
Explicit zeroing is not needed as GFP_PGTABLE_KERNEL includes
__GFP_ZERO. The generic pmd_free() can handle higher allocation
orders so we don't need to define our own.
These changes ensure that pagetable_pmd_[cd]tor are called,
improving the accounting of page table pages.
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
arch/parisc/include/asm/pgalloc.h | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/arch/parisc/include/asm/pgalloc.h b/arch/parisc/include/asm/pgalloc.h
index e3e142b1c5c5..3e8dbd79670b 100644
--- a/arch/parisc/include/asm/pgalloc.h
+++ b/arch/parisc/include/asm/pgalloc.h
@@ -11,7 +11,6 @@
#include <asm/cache.h>
#define __HAVE_ARCH_PMD_ALLOC_ONE
-#define __HAVE_ARCH_PMD_FREE
#define __HAVE_ARCH_PGD_FREE
#include <asm-generic/pgalloc.h>
@@ -46,17 +45,19 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
{
- pmd_t *pmd;
+ struct ptdesc *ptdesc;
+ gfp_t gfp = GFP_PGTABLE_USER;
- pmd = (pmd_t *)__get_free_pages(GFP_PGTABLE_KERNEL, PMD_TABLE_ORDER);
- if (likely(pmd))
- memset ((void *)pmd, 0, PAGE_SIZE << PMD_TABLE_ORDER);
- return pmd;
-}
-
-static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
-{
- free_pages((unsigned long)pmd, PMD_TABLE_ORDER);
+ if (mm == &init_mm)
+ gfp = GFP_PGTABLE_KERNEL;
+ ptdesc = pagetable_alloc(gfp, PMD_TABLE_ORDER);
+ if (!ptdesc)
+ return NULL;
+ if (!pagetable_pmd_ctor(ptdesc)) {
+ pagetable_free(ptdesc);
+ return NULL;
+ }
+ return ptdesc_address(ptdesc);
}
#endif
--
2.47.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 3/6] m68k: mm: Add calls to pagetable_pmd_[cd]tor
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 1/6] mm: Move common part of pagetable_*_ctor to helper Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 2/6] parisc: mm: Ensure pagetable_pmd_[cd]tor are called Kevin Brodsky
@ 2025-01-03 18:44 ` Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 4/6] ARM: mm: Rename PGD helpers Kevin Brodsky
` (4 subsequent siblings)
7 siblings, 0 replies; 14+ messages in thread
From: Kevin Brodsky @ 2025-01-03 18:44 UTC (permalink / raw)
To: linux-mm
Cc: Kevin Brodsky, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
get_pointer_table() and free_pointer_table() already special-case
TABLE_PTE to call pagetable_pte_[cd]tor. Let's do the same at PMD
level to improve accounting further. TABLE_PGD and TABLE_PMD are
currently defined to the same value, so we first need to separate
them. That also implies separating ptable_list for PMD/PGD levels.
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
arch/m68k/include/asm/motorola_pgalloc.h | 6 +++---
arch/m68k/mm/motorola.c | 17 ++++++++++++-----
2 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/arch/m68k/include/asm/motorola_pgalloc.h b/arch/m68k/include/asm/motorola_pgalloc.h
index 74a817d9387f..5abe7da8ac5a 100644
--- a/arch/m68k/include/asm/motorola_pgalloc.h
+++ b/arch/m68k/include/asm/motorola_pgalloc.h
@@ -9,9 +9,9 @@ extern void mmu_page_ctor(void *page);
extern void mmu_page_dtor(void *page);
enum m68k_table_types {
- TABLE_PGD = 0,
- TABLE_PMD = 0, /* same size as PGD */
- TABLE_PTE = 1,
+ TABLE_PGD,
+ TABLE_PMD,
+ TABLE_PTE,
};
extern void init_pointer_table(void *table, int type);
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index eab50dda14ee..6c09ccb72e8b 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -97,17 +97,19 @@ void mmu_page_dtor(void *page)
typedef struct list_head ptable_desc;
-static struct list_head ptable_list[2] = {
+static struct list_head ptable_list[3] = {
LIST_HEAD_INIT(ptable_list[0]),
LIST_HEAD_INIT(ptable_list[1]),
+ LIST_HEAD_INIT(ptable_list[2]),
};
#define PD_PTABLE(page) ((ptable_desc *)&(virt_to_page((void *)(page))->lru))
#define PD_PAGE(ptable) (list_entry(ptable, struct page, lru))
#define PD_MARKBITS(dp) (*(unsigned int *)&PD_PAGE(dp)->index)
-static const int ptable_shift[2] = {
- 7+2, /* PGD, PMD */
+static const int ptable_shift[3] = {
+ 7+2, /* PGD */
+ 7+2, /* PMD */
6+2, /* PTE */
};
@@ -156,12 +158,17 @@ void *get_pointer_table(int type)
if (!(page = (void *)get_zeroed_page(GFP_KERNEL)))
return NULL;
- if (type == TABLE_PTE) {
+ switch (type) {
+ case TABLE_PTE:
/*
* m68k doesn't have SPLIT_PTE_PTLOCKS for not having
* SMP.
*/
pagetable_pte_ctor(virt_to_ptdesc(page));
+ break;
+ case TABLE_PMD:
+ pagetable_pmd_ctor(virt_to_ptdesc(page));
+ break;
}
mmu_page_ctor(page);
@@ -200,7 +207,7 @@ int free_pointer_table(void *table, int type)
/* all tables in page are free, free page */
list_del(dp);
mmu_page_dtor((void *)page);
- if (type == TABLE_PTE)
+ if (type == TABLE_PTE || type == TABLE_PMD)
pagetable_dtor(virt_to_ptdesc((void *)page));
free_page (page);
return 1;
--
2.47.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 4/6] ARM: mm: Rename PGD helpers
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
` (2 preceding siblings ...)
2025-01-03 18:44 ` [PATCH v2 3/6] m68k: mm: Add calls to pagetable_pmd_[cd]tor Kevin Brodsky
@ 2025-01-03 18:44 ` Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 5/6] asm-generic: pgalloc: Provide generic __pgd_{alloc,free} Kevin Brodsky
` (3 subsequent siblings)
7 siblings, 0 replies; 14+ messages in thread
From: Kevin Brodsky @ 2025-01-03 18:44 UTC (permalink / raw)
To: linux-mm
Cc: Kevin Brodsky, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
Generic implementations of __pgd_alloc and __pgd_free are about to
be introduced. Rename the macros in arch/arm/mm/pgd.c to avoid
clashes. While we're at it, also pass down the mm as argument to
those helpers, as it will be needed to call the generic
__pgd_{alloc,free}.
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
arch/arm/mm/pgd.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/arch/arm/mm/pgd.c b/arch/arm/mm/pgd.c
index f8e9bc58a84f..2a1077747758 100644
--- a/arch/arm/mm/pgd.c
+++ b/arch/arm/mm/pgd.c
@@ -17,11 +17,11 @@
#include "mm.h"
#ifdef CONFIG_ARM_LPAE
-#define __pgd_alloc() kmalloc_array(PTRS_PER_PGD, sizeof(pgd_t), GFP_KERNEL)
-#define __pgd_free(pgd) kfree(pgd)
+#define _pgd_alloc(mm) kmalloc_array(PTRS_PER_PGD, sizeof(pgd_t), GFP_KERNEL)
+#define _pgd_free(mm, pgd) kfree(pgd)
#else
-#define __pgd_alloc() (pgd_t *)__get_free_pages(GFP_KERNEL, 2)
-#define __pgd_free(pgd) free_pages((unsigned long)pgd, 2)
+#define _pgd_alloc(mm) (pgd_t *)__get_free_pages(GFP_KERNEL, 2)
+#define _pgd_free(mm, pgd) free_pages((unsigned long)pgd, 2)
#endif
/*
@@ -35,7 +35,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
pmd_t *new_pmd, *init_pmd;
pte_t *new_pte, *init_pte;
- new_pgd = __pgd_alloc();
+ new_pgd = _pgd_alloc(mm);
if (!new_pgd)
goto no_pgd;
@@ -134,7 +134,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
no_pud:
p4d_free(mm, new_p4d);
no_p4d:
- __pgd_free(new_pgd);
+ _pgd_free(mm, new_pgd);
no_pgd:
return NULL;
}
@@ -207,5 +207,5 @@ void pgd_free(struct mm_struct *mm, pgd_t *pgd_base)
p4d_free(mm, p4d);
}
#endif
- __pgd_free(pgd_base);
+ _pgd_free(mm, pgd_base);
}
--
2.47.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 5/6] asm-generic: pgalloc: Provide generic __pgd_{alloc,free}
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
` (3 preceding siblings ...)
2025-01-03 18:44 ` [PATCH v2 4/6] ARM: mm: Rename PGD helpers Kevin Brodsky
@ 2025-01-03 18:44 ` Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level Kevin Brodsky
` (2 subsequent siblings)
7 siblings, 0 replies; 14+ messages in thread
From: Kevin Brodsky @ 2025-01-03 18:44 UTC (permalink / raw)
To: linux-mm
Cc: Kevin Brodsky, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
We already have a generic implementation of alloc/free up to P4D
level, as well as pgd_free(). Let's finish the work and add a
generic PGD-level alloc helper as well.
Unlike at lower levels, almost all architectures need some specific
magic at PGD level (typically initialising PGD entries), so
introducing a generic pgd_alloc() isn't worth it. Instead we
introduce two new helpers, __pgd_alloc() and __pgd_free(), and make
use of them in the arch-specific pgd_alloc() and pgd_free() wherever
possible. To accommodate as many arch as possible, __pgd_alloc()
takes a page allocation order.
Because pagetable_alloc() allocates zeroed pages, explicit zeroing
in pgd_alloc() becomes redundant and we can get rid of it.
Some trivial implementations of pgd_free() also become unnecessary
once __pgd_alloc() is used; remove them.
Another small improvement is consistent accounting of PGD pages by
using GFP_PGTABLE_{USER,KERNEL} as appropriate.
Not all PGD allocations can be handled by the generic helpers. In
particular, multiple architectures allocate PGDs from a kmem_cache,
and those PGDs may not be page-sized.
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
arch/alpha/mm/init.c | 2 +-
arch/arc/include/asm/pgalloc.h | 9 ++-------
arch/arm/mm/pgd.c | 8 +++-----
arch/arm64/mm/pgd.c | 4 ++--
arch/csky/include/asm/pgalloc.h | 2 +-
arch/hexagon/include/asm/pgalloc.h | 2 +-
arch/loongarch/mm/pgtable.c | 7 +++----
arch/m68k/include/asm/sun3_pgalloc.h | 2 +-
arch/microblaze/include/asm/pgalloc.h | 7 +------
arch/mips/include/asm/pgalloc.h | 6 ------
arch/mips/mm/pgtable.c | 8 +++-----
arch/nios2/mm/pgtable.c | 3 ++-
arch/openrisc/include/asm/pgalloc.h | 6 ++----
arch/parisc/include/asm/pgalloc.h | 16 +---------------
arch/riscv/include/asm/pgalloc.h | 3 +--
arch/um/kernel/mem.c | 7 +++----
arch/x86/mm/pgtable.c | 24 +++++++++++-------------
arch/xtensa/include/asm/pgalloc.h | 2 +-
include/asm-generic/pgalloc.h | 27 ++++++++++++++++++++++++++-
19 files changed, 65 insertions(+), 80 deletions(-)
diff --git a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c
index 4fe618446e4c..61c2198b1359 100644
--- a/arch/alpha/mm/init.c
+++ b/arch/alpha/mm/init.c
@@ -42,7 +42,7 @@ pgd_alloc(struct mm_struct *mm)
{
pgd_t *ret, *init;
- ret = (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
+ ret = __pgd_alloc(mm, 0);
init = pgd_offset(&init_mm, 0UL);
if (ret) {
#ifdef CONFIG_ALPHA_LARGE_VMALLOC
diff --git a/arch/arc/include/asm/pgalloc.h b/arch/arc/include/asm/pgalloc.h
index 096b8ef58edb..dfae070fe8d5 100644
--- a/arch/arc/include/asm/pgalloc.h
+++ b/arch/arc/include/asm/pgalloc.h
@@ -53,19 +53,14 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t pte_
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
{
- pgd_t *ret = (pgd_t *) __get_free_page(GFP_KERNEL);
+ pgd_t *ret = __pgd_alloc(mm, 0);
if (ret) {
int num, num2;
- num = USER_PTRS_PER_PGD + USER_KERNEL_GUTTER / PGDIR_SIZE;
- memzero(ret, num * sizeof(pgd_t));
+ num = USER_PTRS_PER_PGD + USER_KERNEL_GUTTER / PGDIR_SIZE;
num2 = VMALLOC_SIZE / PGDIR_SIZE;
memcpy(ret + num, swapper_pg_dir + num, num2 * sizeof(pgd_t));
-
- memzero(ret + num + num2,
- (PTRS_PER_PGD - num - num2) * sizeof(pgd_t));
-
}
return ret;
}
diff --git a/arch/arm/mm/pgd.c b/arch/arm/mm/pgd.c
index 2a1077747758..4eb81b7ed03a 100644
--- a/arch/arm/mm/pgd.c
+++ b/arch/arm/mm/pgd.c
@@ -17,11 +17,11 @@
#include "mm.h"
#ifdef CONFIG_ARM_LPAE
-#define _pgd_alloc(mm) kmalloc_array(PTRS_PER_PGD, sizeof(pgd_t), GFP_KERNEL)
+#define _pgd_alloc(mm) kmalloc_array(PTRS_PER_PGD, sizeof(pgd_t), GFP_KERNEL | __GFP_ZERO)
#define _pgd_free(mm, pgd) kfree(pgd)
#else
-#define _pgd_alloc(mm) (pgd_t *)__get_free_pages(GFP_KERNEL, 2)
-#define _pgd_free(mm, pgd) free_pages((unsigned long)pgd, 2)
+#define _pgd_alloc(mm) __pgd_alloc(mm, 2)
+#define _pgd_free(mm, pgd) __pgd_free(mm, pgd)
#endif
/*
@@ -39,8 +39,6 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
if (!new_pgd)
goto no_pgd;
- memset(new_pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
-
/*
* Copy over the kernel and IO PGD entries
*/
diff --git a/arch/arm64/mm/pgd.c b/arch/arm64/mm/pgd.c
index 0c501cabc238..8160cff35089 100644
--- a/arch/arm64/mm/pgd.c
+++ b/arch/arm64/mm/pgd.c
@@ -33,7 +33,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
gfp_t gfp = GFP_PGTABLE_USER;
if (pgdir_is_page_size())
- return (pgd_t *)__get_free_page(gfp);
+ return __pgd_alloc(mm, 0);
else
return kmem_cache_alloc(pgd_cache, gfp);
}
@@ -41,7 +41,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
if (pgdir_is_page_size())
- free_page((unsigned long)pgd);
+ __pgd_free(mm, pgd);
else
kmem_cache_free(pgd_cache, pgd);
}
diff --git a/arch/csky/include/asm/pgalloc.h b/arch/csky/include/asm/pgalloc.h
index f1ce5b7b28f2..bf8400c28b5a 100644
--- a/arch/csky/include/asm/pgalloc.h
+++ b/arch/csky/include/asm/pgalloc.h
@@ -44,7 +44,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
pgd_t *ret;
pgd_t *init;
- ret = (pgd_t *) __get_free_page(GFP_KERNEL);
+ ret = __pgd_alloc(mm, 0);
if (ret) {
init = pgd_offset(&init_mm, 0UL);
pgd_init((unsigned long *)ret);
diff --git a/arch/hexagon/include/asm/pgalloc.h b/arch/hexagon/include/asm/pgalloc.h
index 40e42a0e7167..1ee5f5f157ca 100644
--- a/arch/hexagon/include/asm/pgalloc.h
+++ b/arch/hexagon/include/asm/pgalloc.h
@@ -22,7 +22,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
{
pgd_t *pgd;
- pgd = (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
+ pgd = __pgd_alloc(mm, 0);
/*
* There may be better ways to do this, but to ensure
diff --git a/arch/loongarch/mm/pgtable.c b/arch/loongarch/mm/pgtable.c
index 3fa69b23ff84..22a94bb3e6e8 100644
--- a/arch/loongarch/mm/pgtable.c
+++ b/arch/loongarch/mm/pgtable.c
@@ -23,11 +23,10 @@ EXPORT_SYMBOL(tlb_virt_to_page);
pgd_t *pgd_alloc(struct mm_struct *mm)
{
- pgd_t *init, *ret = NULL;
- struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL & ~__GFP_HIGHMEM, 0);
+ pgd_t *init, *ret;
- if (ptdesc) {
- ret = (pgd_t *)ptdesc_address(ptdesc);
+ ret = __pgd_alloc(mm, 0);
+ if (ret) {
init = pgd_offset(&init_mm, 0UL);
pgd_init(ret);
memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
diff --git a/arch/m68k/include/asm/sun3_pgalloc.h b/arch/m68k/include/asm/sun3_pgalloc.h
index 2b626cb3ad0a..f1ae4ed890db 100644
--- a/arch/m68k/include/asm/sun3_pgalloc.h
+++ b/arch/m68k/include/asm/sun3_pgalloc.h
@@ -43,7 +43,7 @@ static inline pgd_t * pgd_alloc(struct mm_struct *mm)
{
pgd_t *new_pgd;
- new_pgd = (pgd_t *)get_zeroed_page(GFP_KERNEL);
+ new_pgd = __pgd_alloc(mm, 0);
memcpy(new_pgd, swapper_pg_dir, PAGE_SIZE);
memset(new_pgd, 0, (PAGE_OFFSET >> PGDIR_SHIFT));
return new_pgd;
diff --git a/arch/microblaze/include/asm/pgalloc.h b/arch/microblaze/include/asm/pgalloc.h
index 6c33b05f730f..084a8a0dc239 100644
--- a/arch/microblaze/include/asm/pgalloc.h
+++ b/arch/microblaze/include/asm/pgalloc.h
@@ -21,12 +21,7 @@
extern void __bad_pte(pmd_t *pmd);
-static inline pgd_t *get_pgd(void)
-{
- return (pgd_t *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, 0);
-}
-
-#define pgd_alloc(mm) get_pgd()
+#define pgd_alloc(mm) __pgd_alloc(mm, 0)
extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
diff --git a/arch/mips/include/asm/pgalloc.h b/arch/mips/include/asm/pgalloc.h
index 36d9805033c4..26c7a6ede983 100644
--- a/arch/mips/include/asm/pgalloc.h
+++ b/arch/mips/include/asm/pgalloc.h
@@ -15,7 +15,6 @@
#define __HAVE_ARCH_PMD_ALLOC_ONE
#define __HAVE_ARCH_PUD_ALLOC_ONE
-#define __HAVE_ARCH_PGD_FREE
#include <asm-generic/pgalloc.h>
static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
@@ -49,11 +48,6 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
extern void pgd_init(void *addr);
extern pgd_t *pgd_alloc(struct mm_struct *mm);
-static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
-{
- pagetable_free(virt_to_ptdesc(pgd));
-}
-
#define __pte_free_tlb(tlb, pte, address) \
do { \
pagetable_dtor(page_ptdesc(pte)); \
diff --git a/arch/mips/mm/pgtable.c b/arch/mips/mm/pgtable.c
index 1506e458040d..10835414819f 100644
--- a/arch/mips/mm/pgtable.c
+++ b/arch/mips/mm/pgtable.c
@@ -10,12 +10,10 @@
pgd_t *pgd_alloc(struct mm_struct *mm)
{
- pgd_t *init, *ret = NULL;
- struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL & ~__GFP_HIGHMEM,
- PGD_TABLE_ORDER);
+ pgd_t *init, *ret;
- if (ptdesc) {
- ret = ptdesc_address(ptdesc);
+ ret = __pgd_alloc(mm, PGD_TABLE_ORDER);
+ if (ret) {
init = pgd_offset(&init_mm, 0UL);
pgd_init(ret);
memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
diff --git a/arch/nios2/mm/pgtable.c b/arch/nios2/mm/pgtable.c
index 7c76e8a7447a..6470ed378782 100644
--- a/arch/nios2/mm/pgtable.c
+++ b/arch/nios2/mm/pgtable.c
@@ -11,6 +11,7 @@
#include <linux/sched.h>
#include <asm/cpuinfo.h>
+#include <asm/pgalloc.h>
/* pteaddr:
* ptbase | vpn* | zero
@@ -54,7 +55,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
{
pgd_t *ret, *init;
- ret = (pgd_t *) __get_free_page(GFP_KERNEL);
+ ret = __pgd_alloc(mm, 0);
if (ret) {
init = pgd_offset(&init_mm, 0UL);
pgd_init(ret);
diff --git a/arch/openrisc/include/asm/pgalloc.h b/arch/openrisc/include/asm/pgalloc.h
index 596e2355824e..3372f4e6ab4b 100644
--- a/arch/openrisc/include/asm/pgalloc.h
+++ b/arch/openrisc/include/asm/pgalloc.h
@@ -41,15 +41,13 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
*/
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
{
- pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL);
+ pgd_t *ret = __pgd_alloc(mm, 0);
- if (ret) {
- memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
+ if (ret)
memcpy(ret + USER_PTRS_PER_PGD,
swapper_pg_dir + USER_PTRS_PER_PGD,
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
- }
return ret;
}
diff --git a/arch/parisc/include/asm/pgalloc.h b/arch/parisc/include/asm/pgalloc.h
index 3e8dbd79670b..2ca74a56415c 100644
--- a/arch/parisc/include/asm/pgalloc.h
+++ b/arch/parisc/include/asm/pgalloc.h
@@ -11,26 +11,12 @@
#include <asm/cache.h>
#define __HAVE_ARCH_PMD_ALLOC_ONE
-#define __HAVE_ARCH_PGD_FREE
#include <asm-generic/pgalloc.h>
/* Allocate the top level pgd (page directory) */
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
{
- pgd_t *pgd;
-
- pgd = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_TABLE_ORDER);
- if (unlikely(pgd == NULL))
- return NULL;
-
- memset(pgd, 0, PAGE_SIZE << PGD_TABLE_ORDER);
-
- return pgd;
-}
-
-static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
-{
- free_pages((unsigned long)pgd, PGD_TABLE_ORDER);
+ return __pgd_alloc(mm, PGD_TABLE_ORDER);
}
#if CONFIG_PGTABLE_LEVELS == 3
diff --git a/arch/riscv/include/asm/pgalloc.h b/arch/riscv/include/asm/pgalloc.h
index c8907b831711..3e2aebea6312 100644
--- a/arch/riscv/include/asm/pgalloc.h
+++ b/arch/riscv/include/asm/pgalloc.h
@@ -130,9 +130,8 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
{
pgd_t *pgd;
- pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
+ pgd = __pgd_alloc(mm, 0);
if (likely(pgd != NULL)) {
- memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
/* Copy kernel mappings */
sync_kernel_mappings(pgd);
}
diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c
index 53248ed04771..d98812907493 100644
--- a/arch/um/kernel/mem.c
+++ b/arch/um/kernel/mem.c
@@ -214,14 +214,13 @@ void free_initmem(void)
pgd_t *pgd_alloc(struct mm_struct *mm)
{
- pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
+ pgd_t *pgd = __pgd_alloc(mm, 0);
- if (pgd) {
- memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
+ if (pgd)
memcpy(pgd + USER_PTRS_PER_PGD,
swapper_pg_dir + USER_PTRS_PER_PGD,
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
- }
+
return pgd;
}
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
index a0b0e501ba66..29b0196ae49c 100644
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -395,15 +395,14 @@ void __init pgtable_cache_init(void)
SLAB_PANIC, NULL);
}
-static inline pgd_t *_pgd_alloc(void)
+static inline pgd_t *_pgd_alloc(struct mm_struct *mm)
{
/*
* If no SHARED_KERNEL_PMD, PAE kernel is running as a Xen domain.
* We allocate one page for pgd.
*/
if (!SHARED_KERNEL_PMD)
- return (pgd_t *)__get_free_pages(GFP_PGTABLE_USER,
- PGD_ALLOCATION_ORDER);
+ return __pgd_alloc(mm, PGD_ALLOCATION_ORDER);
/*
* Now PAE kernel is not running as a Xen domain. We can allocate
@@ -412,24 +411,23 @@ static inline pgd_t *_pgd_alloc(void)
return kmem_cache_alloc(pgd_cache, GFP_PGTABLE_USER);
}
-static inline void _pgd_free(pgd_t *pgd)
+static inline void _pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
if (!SHARED_KERNEL_PMD)
- free_pages((unsigned long)pgd, PGD_ALLOCATION_ORDER);
+ __pgd_free(mm, pgd);
else
kmem_cache_free(pgd_cache, pgd);
}
#else
-static inline pgd_t *_pgd_alloc(void)
+static inline pgd_t *_pgd_alloc(struct mm_struct *mm)
{
- return (pgd_t *)__get_free_pages(GFP_PGTABLE_USER,
- PGD_ALLOCATION_ORDER);
+ return __pgd_alloc(mm, PGD_ALLOCATION_ORDER);
}
-static inline void _pgd_free(pgd_t *pgd)
+static inline void _pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
- free_pages((unsigned long)pgd, PGD_ALLOCATION_ORDER);
+ __pgd_free(mm, pgd);
}
#endif /* CONFIG_X86_PAE */
@@ -439,7 +437,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
pmd_t *u_pmds[MAX_PREALLOCATED_USER_PMDS];
pmd_t *pmds[MAX_PREALLOCATED_PMDS];
- pgd = _pgd_alloc();
+ pgd = _pgd_alloc(mm);
if (pgd == NULL)
goto out;
@@ -482,7 +480,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
if (sizeof(pmds) != 0)
free_pmds(mm, pmds, PREALLOCATED_PMDS);
out_free_pgd:
- _pgd_free(pgd);
+ _pgd_free(mm, pgd);
out:
return NULL;
}
@@ -492,7 +490,7 @@ void pgd_free(struct mm_struct *mm, pgd_t *pgd)
pgd_mop_up_pmds(mm, pgd);
pgd_dtor(pgd);
paravirt_pgd_free(mm, pgd);
- _pgd_free(pgd);
+ _pgd_free(mm, pgd);
}
/*
diff --git a/arch/xtensa/include/asm/pgalloc.h b/arch/xtensa/include/asm/pgalloc.h
index 7fc0f9126dd3..1919ee9c3dd6 100644
--- a/arch/xtensa/include/asm/pgalloc.h
+++ b/arch/xtensa/include/asm/pgalloc.h
@@ -29,7 +29,7 @@
static inline pgd_t*
pgd_alloc(struct mm_struct *mm)
{
- return (pgd_t*) __get_free_page(GFP_KERNEL | __GFP_ZERO);
+ return __pgd_alloc(mm, 0);
}
static inline void ptes_clear(pte_t *ptep)
diff --git a/include/asm-generic/pgalloc.h b/include/asm-generic/pgalloc.h
index e3977ddca15e..de4df14158e6 100644
--- a/include/asm-generic/pgalloc.h
+++ b/include/asm-generic/pgalloc.h
@@ -258,10 +258,35 @@ static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d)
#endif /* CONFIG_PGTABLE_LEVELS > 4 */
+static inline pgd_t *__pgd_alloc_noprof(struct mm_struct *mm, unsigned int order)
+{
+ gfp_t gfp = GFP_PGTABLE_USER;
+ struct ptdesc *ptdesc;
+
+ if (mm == &init_mm)
+ gfp = GFP_PGTABLE_KERNEL;
+ gfp &= ~__GFP_HIGHMEM;
+
+ ptdesc = pagetable_alloc_noprof(gfp, order);
+ if (!ptdesc)
+ return NULL;
+
+ return ptdesc_address(ptdesc);
+}
+#define __pgd_alloc(...) alloc_hooks(__pgd_alloc_noprof(__VA_ARGS__))
+
+static inline void __pgd_free(struct mm_struct *mm, pgd_t *pgd)
+{
+ struct ptdesc *ptdesc = virt_to_ptdesc(pgd);
+
+ BUG_ON((unsigned long)pgd & (PAGE_SIZE-1));
+ pagetable_free(ptdesc);
+}
+
#ifndef __HAVE_ARCH_PGD_FREE
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
- pagetable_free(virt_to_ptdesc(pgd));
+ __pgd_free(mm, pgd);
}
#endif
--
2.47.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
` (4 preceding siblings ...)
2025-01-03 18:44 ` [PATCH v2 5/6] asm-generic: pgalloc: Provide generic __pgd_{alloc,free} Kevin Brodsky
@ 2025-01-03 18:44 ` Kevin Brodsky
2025-01-21 16:37 ` Alexander Gordeev
2025-01-06 8:38 ` [PATCH v2 0/6] Account page tables at all levels Qi Zheng
2025-02-03 19:15 ` patchwork-bot+linux-riscv
7 siblings, 1 reply; 14+ messages in thread
From: Kevin Brodsky @ 2025-01-03 18:44 UTC (permalink / raw)
To: linux-mm
Cc: Kevin Brodsky, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
Following on from the introduction of P4D-level ctor/dtor, let's
finish the job and introduce ctor/dtor at PGD level. The incurred
improvement in page accounting is minimal - the main motivation is
to create a single, generic place where construction/destruction
hooks can be added for all page table pages.
This patch should cover all architectures and all configurations
where PGDs are one or more regular pages. This excludes any
configuration where PGDs are allocated from a kmem_cache object.
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
arch/m68k/include/asm/mcf_pgalloc.h | 3 ++-
arch/m68k/mm/motorola.c | 6 ++++--
arch/s390/include/asm/pgalloc.h | 9 ++++++++-
include/asm-generic/pgalloc.h | 3 ++-
include/linux/mm.h | 5 +++++
5 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/arch/m68k/include/asm/mcf_pgalloc.h b/arch/m68k/include/asm/mcf_pgalloc.h
index 22d6c1fcabfb..4c648b51e7fd 100644
--- a/arch/m68k/include/asm/mcf_pgalloc.h
+++ b/arch/m68k/include/asm/mcf_pgalloc.h
@@ -73,7 +73,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pgtable)
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
- pagetable_free(virt_to_ptdesc(pgd));
+ pagetable_dtor_free(virt_to_ptdesc(pgd));
}
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
@@ -84,6 +84,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
if (!ptdesc)
return NULL;
+ pagetable_pgd_ctor(ptdesc);
new_pgd = ptdesc_address(ptdesc);
memcpy(new_pgd, swapper_pg_dir, PTRS_PER_PGD * sizeof(pgd_t));
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index 6c09ccb72e8b..73651e093c4d 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -169,6 +169,9 @@ void *get_pointer_table(int type)
case TABLE_PMD:
pagetable_pmd_ctor(virt_to_ptdesc(page));
break;
+ case TABLE_PGD:
+ pagetable_pgd_ctor(virt_to_ptdesc(page));
+ break;
}
mmu_page_ctor(page);
@@ -207,8 +210,7 @@ int free_pointer_table(void *table, int type)
/* all tables in page are free, free page */
list_del(dp);
mmu_page_dtor((void *)page);
- if (type == TABLE_PTE || type == TABLE_PMD)
- pagetable_dtor(virt_to_ptdesc((void *)page));
+ pagetable_dtor(virt_to_ptdesc((void *)page));
free_page (page);
return 1;
} else if (ptable_list[type].next != dp) {
diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h
index 5fced6d3c36b..b19b6ed2ab53 100644
--- a/arch/s390/include/asm/pgalloc.h
+++ b/arch/s390/include/asm/pgalloc.h
@@ -130,11 +130,18 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
{
- return (pgd_t *) crst_table_alloc(mm);
+ unsigned long *table = crst_table_alloc(mm);
+
+ if (!table)
+ return NULL;
+ pagetable_pgd_ctor(virt_to_ptdesc(table));
+
+ return (pgd_t *) table;
}
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
+ pagetable_dtor(virt_to_ptdesc(pgd));
crst_table_free(mm, (unsigned long *) pgd);
}
diff --git a/include/asm-generic/pgalloc.h b/include/asm-generic/pgalloc.h
index de4df14158e6..892ece4558a2 100644
--- a/include/asm-generic/pgalloc.h
+++ b/include/asm-generic/pgalloc.h
@@ -271,6 +271,7 @@ static inline pgd_t *__pgd_alloc_noprof(struct mm_struct *mm, unsigned int order
if (!ptdesc)
return NULL;
+ pagetable_pgd_ctor(ptdesc);
return ptdesc_address(ptdesc);
}
#define __pgd_alloc(...) alloc_hooks(__pgd_alloc_noprof(__VA_ARGS__))
@@ -280,7 +281,7 @@ static inline void __pgd_free(struct mm_struct *mm, pgd_t *pgd)
struct ptdesc *ptdesc = virt_to_ptdesc(pgd);
BUG_ON((unsigned long)pgd & (PAGE_SIZE-1));
- pagetable_free(ptdesc);
+ pagetable_dtor_free(ptdesc);
}
#ifndef __HAVE_ARCH_PGD_FREE
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 065fa9449d03..486638d22fc6 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3243,6 +3243,11 @@ static inline void pagetable_p4d_ctor(struct ptdesc *ptdesc)
__pagetable_ctor(ptdesc);
}
+static inline void pagetable_pgd_ctor(struct ptdesc *ptdesc)
+{
+ __pagetable_ctor(ptdesc);
+}
+
extern void __init pagecache_init(void);
extern void free_initmem(void);
--
2.47.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/6] Account page tables at all levels
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
` (5 preceding siblings ...)
2025-01-03 18:44 ` [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level Kevin Brodsky
@ 2025-01-06 8:38 ` Qi Zheng
2025-01-07 9:15 ` Kevin Brodsky
2025-02-03 19:15 ` patchwork-bot+linux-riscv
7 siblings, 1 reply; 14+ messages in thread
From: Qi Zheng @ 2025-01-06 8:38 UTC (permalink / raw)
To: Kevin Brodsky
Cc: linux-mm, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, linux-alpha, linux-arch, linux-arm-kernel,
linux-csky, linux-hexagon, linux-kernel, linux-m68k, linux-mips,
linux-openrisc, linux-parisc, linux-riscv, linux-s390,
linux-snps-arc, linux-um, loongarch, x86
On 2025/1/4 02:44, Kevin Brodsky wrote:
> v1: https://lore.kernel.org/linux-mm/20241219164425.2277022-1-kevin.brodsky@arm.com/
>
> This series should be considered in conjunction with Qi's series [1].
> Together, they ensure that page table ctor/dtor are called at all levels
> (PTE to PGD) and all architectures, where page tables are regular pages.
> Besides the improvement in accounting and general cleanup, this also
> create a single place where construction/destruction hooks can be called
> for all page tables, namely the now-generic pagetable_dtor() introduced
> by Qi, and __pagetable_ctor() introduced in this series.
>
> v2 is essentially v1 rebased on top of mm-unstable, which includes Qi's
> v4 series. A number of patches from v1 were dropped:
>
> * v1 patch 4 is superseded by patch 6 in Qi's series.
> * v1 patch 5 and 6 moved to Qi's series from v3 onwards.
> * v1 patch 7 is superseded by patch 4 in Qi's series.
>
> Changes from v1 in the remaining patches:
>
> * Patch 1 only introduces __pagetable_ctor() as there is now a single
> generic pagetable_dtor().
>
> * Patch 3 and 6: in arch/m68k/mm/motorola.c, free_pointer_table() can
> now unconditionally call pagetable_dtor() since it is the same for all
> levels.
>
> * Patch 6 just uses pagetable_dtor() instead of introducing
> pagetable_pgd_dtor().
>
> * Added Dave Hansen's Acked-by to all patches.
>
> - Kevin
>
> [1] https://lore.kernel.org/linux-mm/cover.1735549103.git.zhengqi.arch@bytedance.com/
> ---
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Dave Hansen <dave.hansen@linux.intel.com>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Andy Lutomirski <luto@kernel.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: "Mike Rapoport (IBM)" <rppt@kernel.org>
> Cc: Ryan Roberts <ryan.roberts@arm.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Will Deacon <will@kernel.org>
> Cc: Matthew Wilcox <willy@infradead.org>
> Cc: Qi Zheng <zhengqi.arch@bytedance.com>
> Cc: linux-alpha@vger.kernel.org
> Cc: linux-arch@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-csky@vger.kernel.org
> Cc: linux-hexagon@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Cc: linux-m68k@lists.linux-m68k.org
> Cc: linux-mips@vger.kernel.org
> Cc: linux-openrisc@vger.kernel.org
> Cc: linux-parisc@vger.kernel.org
> Cc: linux-riscv@lists.infradead.org
> Cc: linux-s390@vger.kernel.org
> Cc: linux-snps-arc@lists.infradead.org
> Cc: linux-um@lists.infradead.org
> Cc: loongarch@lists.linux.dev
> Cc: x86@kernel.org
> ---
> Kevin Brodsky (6):
> mm: Move common part of pagetable_*_ctor to helper
> parisc: mm: Ensure pagetable_pmd_[cd]tor are called
> m68k: mm: Add calls to pagetable_pmd_[cd]tor
> ARM: mm: Rename PGD helpers
> asm-generic: pgalloc: Provide generic __pgd_{alloc,free}
> mm: Introduce ctor/dtor at PGD level
For this series:
Acked-by: Qi Zheng <zhengqi.arch@bytedance.com>
Thanks!
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/6] Account page tables at all levels
2025-01-06 8:38 ` [PATCH v2 0/6] Account page tables at all levels Qi Zheng
@ 2025-01-07 9:15 ` Kevin Brodsky
0 siblings, 0 replies; 14+ messages in thread
From: Kevin Brodsky @ 2025-01-07 9:15 UTC (permalink / raw)
To: Qi Zheng
Cc: linux-mm, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, linux-alpha, linux-arch, linux-arm-kernel,
linux-csky, linux-hexagon, linux-kernel, linux-m68k, linux-mips,
linux-openrisc, linux-parisc, linux-riscv, linux-s390,
linux-snps-arc, linux-um, loongarch, x86
On 06/01/2025 09:38, Qi Zheng wrote:
> For this series:
>
> Acked-by: Qi Zheng <zhengqi.arch@bytedance.com>
Thank you for the review, appreciated!
- Kevin
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level
2025-01-03 18:44 ` [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level Kevin Brodsky
@ 2025-01-21 16:37 ` Alexander Gordeev
2025-01-22 7:49 ` Heiko Carstens
0 siblings, 1 reply; 14+ messages in thread
From: Alexander Gordeev @ 2025-01-21 16:37 UTC (permalink / raw)
To: Kevin Brodsky
Cc: linux-mm, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
On Fri, Jan 03, 2025 at 06:44:15PM +0000, Kevin Brodsky wrote:
Hi Kevin,
...
> diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h
> index 5fced6d3c36b..b19b6ed2ab53 100644
> --- a/arch/s390/include/asm/pgalloc.h
> +++ b/arch/s390/include/asm/pgalloc.h
> @@ -130,11 +130,18 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
>
> static inline pgd_t *pgd_alloc(struct mm_struct *mm)
> {
> - return (pgd_t *) crst_table_alloc(mm);
> + unsigned long *table = crst_table_alloc(mm);
> +
> + if (!table)
> + return NULL;
I do not know status of this series, but FWIW, this call is missed:
crst_table_init(table, _REGION1_ENTRY_EMPTY);
> + pagetable_pgd_ctor(virt_to_ptdesc(table));
> +
> + return (pgd_t *) table;
> }
>
> static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
> {
> + pagetable_dtor(virt_to_ptdesc(pgd));
> crst_table_free(mm, (unsigned long *) pgd);
> }
...
Thanks!
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level
2025-01-21 16:37 ` Alexander Gordeev
@ 2025-01-22 7:49 ` Heiko Carstens
2025-01-22 14:06 ` Alexander Gordeev
0 siblings, 1 reply; 14+ messages in thread
From: Heiko Carstens @ 2025-01-22 7:49 UTC (permalink / raw)
To: Alexander Gordeev
Cc: Kevin Brodsky, linux-mm, Andrew Morton, Catalin Marinas,
Dave Hansen, Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
On Tue, Jan 21, 2025 at 05:37:33PM +0100, Alexander Gordeev wrote:
> On Fri, Jan 03, 2025 at 06:44:15PM +0000, Kevin Brodsky wrote:
>
> Hi Kevin,
> ...
> > diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h
> > index 5fced6d3c36b..b19b6ed2ab53 100644
> > --- a/arch/s390/include/asm/pgalloc.h
> > +++ b/arch/s390/include/asm/pgalloc.h
> > @@ -130,11 +130,18 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
> >
> > static inline pgd_t *pgd_alloc(struct mm_struct *mm)
> > {
> > - return (pgd_t *) crst_table_alloc(mm);
> > + unsigned long *table = crst_table_alloc(mm);
> > +
> > + if (!table)
> > + return NULL;
>
> I do not know status of this series, but FWIW, this call is missed:
>
> crst_table_init(table, _REGION1_ENTRY_EMPTY);
Why is that missing?
A pgd table can be a Region1, Region2, or Region3 table. The only caller of
this function is mm_init() via mm_alloc_pgd(); and right after mm_alloc_pgd()
there is a call to init_new_context() which will initialize the pgd correctly.
I guess what really gets odd, and might be broken (haven't checked yet) is
what happens on dynamic upgrade of page table levels (->crst_table_upgrade()).
With that a pgd may become a pud, and with that we get an imbalance with
the ctor/dtor calls for the various page table levels when they get freed
again. Plus, at first glance, it looks also broken that we have open-coded
crst_alloc() calls instead of using the "proper" page table allocation API
within crst_table_upgrade(), which again would cause an imbalance.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level
2025-01-22 7:49 ` Heiko Carstens
@ 2025-01-22 14:06 ` Alexander Gordeev
2025-01-22 21:16 ` Alexander Gordeev
0 siblings, 1 reply; 14+ messages in thread
From: Alexander Gordeev @ 2025-01-22 14:06 UTC (permalink / raw)
To: Heiko Carstens
Cc: Kevin Brodsky, linux-mm, Andrew Morton, Catalin Marinas,
Dave Hansen, Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
On Wed, Jan 22, 2025 at 08:49:54AM +0100, Heiko Carstens wrote:
> > > static inline pgd_t *pgd_alloc(struct mm_struct *mm)
> > > {
> > > - return (pgd_t *) crst_table_alloc(mm);
> > > + unsigned long *table = crst_table_alloc(mm);
> > > +
> > > + if (!table)
> > > + return NULL;
> >
> > I do not know status of this series, but FWIW, this call is missed:
> >
> > crst_table_init(table, _REGION1_ENTRY_EMPTY);
>
> Why is that missing?
Because the follow-up pagetable_pgd_ctor() is called against uninitialized
page table, while other pagetable_pXd_ctor() variants are called against
initialized one. I could imagine complications as result of that.
Whether Region1 table is the right choice is a big question though, as you
noticed below.
> A pgd table can be a Region1, Region2, or Region3 table. The only caller of
> this function is mm_init() via mm_alloc_pgd(); and right after mm_alloc_pgd()
> there is a call to init_new_context() which will initialize the pgd correctly.
init_new_context() is in a way a constructor as well, so whole thing looks odd
to me. But I do not immedeately see a better way :(
> I guess what really gets odd, and might be broken (haven't checked yet) is
> what happens on dynamic upgrade of page table levels (->crst_table_upgrade()).
Hmm, that is a good point.
> With that a pgd may become a pud, and with that we get an imbalance with
> the ctor/dtor calls for the various page table levels when they get freed
The ctor/dtor mismatch should not be a problem, as pagetable_pgd|p4d|pud_ctor()
are the same and there is one pagetable_dtor() for all top levels as of now.
But if it ever comes to separate implementations, then we are in the world
of pain.
> again. Plus, at first glance, it looks also broken that we have open-coded
> crst_alloc() calls instead of using the "proper" page table allocation API
> within crst_table_upgrade(), which again would cause an imbalance.
This is a good point too.
Many thanks!
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level
2025-01-22 14:06 ` Alexander Gordeev
@ 2025-01-22 21:16 ` Alexander Gordeev
0 siblings, 0 replies; 14+ messages in thread
From: Alexander Gordeev @ 2025-01-22 21:16 UTC (permalink / raw)
To: Heiko Carstens, Kevin Brodsky
Cc: linux-mm, Andrew Morton, Catalin Marinas, Dave Hansen,
Linus Walleij, Andy Lutomirski, Peter Zijlstra,
Mike Rapoport (IBM), Ryan Roberts, Thomas Gleixner, Will Deacon,
Matthew Wilcox, Qi Zheng, linux-alpha, linux-arch,
linux-arm-kernel, linux-csky, linux-hexagon, linux-kernel,
linux-m68k, linux-mips, linux-openrisc, linux-parisc, linux-riscv,
linux-s390, linux-snps-arc, linux-um, loongarch, x86
On Wed, Jan 22, 2025 at 03:06:05PM +0100, Alexander Gordeev wrote:
Hi Kevin,
> On Wed, Jan 22, 2025 at 08:49:54AM +0100, Heiko Carstens wrote:
> > > > static inline pgd_t *pgd_alloc(struct mm_struct *mm)
> > > > {
> > > > - return (pgd_t *) crst_table_alloc(mm);
> > > > + unsigned long *table = crst_table_alloc(mm);
> > > > +
> > > > + if (!table)
> > > > + return NULL;
> > >
> > > I do not know status of this series, but FWIW, this call is missed:
> > >
> > > crst_table_init(table, _REGION1_ENTRY_EMPTY);
> >
> > Why is that missing?
>
> Because the follow-up pagetable_pgd_ctor() is called against uninitialized
> page table, while other pagetable_pXd_ctor() variants are called against
> initialized one. I could imagine complications as result of that.
>
> Whether Region1 table is the right choice is a big question though, as you
> noticed below.
As discussed with Heiko, we do not want to add the extra crst_table_init() call
at least due to performance impact. So please ignore my comment.
> > A pgd table can be a Region1, Region2, or Region3 table. The only caller of
> > this function is mm_init() via mm_alloc_pgd(); and right after mm_alloc_pgd()
> > there is a call to init_new_context() which will initialize the pgd correctly.
>
> init_new_context() is in a way a constructor as well, so whole thing looks odd
> to me. But I do not immedeately see a better way :(
>
> > I guess what really gets odd, and might be broken (haven't checked yet) is
> > what happens on dynamic upgrade of page table levels (->crst_table_upgrade()).
>
> Hmm, that is a good point.
>
> > With that a pgd may become a pud, and with that we get an imbalance with
> > the ctor/dtor calls for the various page table levels when they get freed
>
> The ctor/dtor mismatch should not be a problem, as pagetable_pgd|p4d|pud_ctor()
> are the same and there is one pagetable_dtor() for all top levels as of now.
> But if it ever comes to separate implementations, then we are in the world
> of pain.
>
> > again. Plus, at first glance, it looks also broken that we have open-coded
> > crst_alloc() calls instead of using the "proper" page table allocation API
> > within crst_table_upgrade(), which again would cause an imbalance.
>
> This is a good point too.
The below bits are seems to be missed. We will test it and send a patch.
diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c
index a4e761902093..d33f55b7ee98 100644
--- a/arch/s390/mm/pgalloc.c
+++ b/arch/s390/mm/pgalloc.c
@@ -88,12 +88,14 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end)
if (unlikely(!p4d))
goto err_p4d;
crst_table_init(p4d, _REGION2_ENTRY_EMPTY);
+ pagetable_p4d_ctor(virt_to_ptdesc(p4d));
}
if (end > _REGION1_SIZE) {
pgd = crst_table_alloc(mm);
if (unlikely(!pgd))
goto err_pgd;
crst_table_init(pgd, _REGION1_ENTRY_EMPTY);
+ pagetable_pgd_ctor(virt_to_ptdesc(pgd));
}
spin_lock_bh(&mm->page_table_lock);
@@ -130,6 +132,7 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end)
return 0;
err_pgd:
+ pagetable_dtor(virt_to_ptdesc(p4d));
crst_table_free(mm, p4d);
err_p4d:
return -ENOMEM;
Thanks!
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/6] Account page tables at all levels
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
` (6 preceding siblings ...)
2025-01-06 8:38 ` [PATCH v2 0/6] Account page tables at all levels Qi Zheng
@ 2025-02-03 19:15 ` patchwork-bot+linux-riscv
7 siblings, 0 replies; 14+ messages in thread
From: patchwork-bot+linux-riscv @ 2025-02-03 19:15 UTC (permalink / raw)
To: Kevin Brodsky
Cc: linux-riscv, linux-mm, akpm, catalin.marinas, dave.hansen,
linus.walleij, luto, peterz, rppt, ryan.roberts, tglx, will,
willy, zhengqi.arch, linux-alpha, linux-arch, linux-arm-kernel,
linux-csky, linux-hexagon, linux-kernel, linux-m68k, linux-mips,
linux-openrisc, linux-parisc, linux-s390, linux-snps-arc,
linux-um, loongarch, x86
Hello:
This series was applied to riscv/linux.git (fixes)
by Andrew Morton <akpm@linux-foundation.org>:
On Fri, 3 Jan 2025 18:44:09 +0000 you wrote:
> v1: https://lore.kernel.org/linux-mm/20241219164425.2277022-1-kevin.brodsky@arm.com/
>
> This series should be considered in conjunction with Qi's series [1].
> Together, they ensure that page table ctor/dtor are called at all levels
> (PTE to PGD) and all architectures, where page tables are regular pages.
> Besides the improvement in accounting and general cleanup, this also
> create a single place where construction/destruction hooks can be called
> for all page tables, namely the now-generic pagetable_dtor() introduced
> by Qi, and __pagetable_ctor() introduced in this series.
>
> [...]
Here is the summary with links:
- [v2,1/6] mm: Move common part of pagetable_*_ctor to helper
https://git.kernel.org/riscv/c/11e2400b21a3
- [v2,2/6] parisc: mm: Ensure pagetable_pmd_[cd]tor are called
https://git.kernel.org/riscv/c/3565522e15eb
- [v2,3/6] m68k: mm: Add calls to pagetable_pmd_[cd]tor
https://git.kernel.org/riscv/c/1879688e5c42
- [v2,4/6] ARM: mm: Rename PGD helpers
https://git.kernel.org/riscv/c/94771023712a
- [v2,5/6] asm-generic: pgalloc: Provide generic __pgd_{alloc,free}
https://git.kernel.org/riscv/c/a9b3c355c2e6
- [v2,6/6] mm: Introduce ctor/dtor at PGD level
https://git.kernel.org/riscv/c/d95936a2267c
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-02-03 19:15 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-03 18:44 [PATCH v2 0/6] Account page tables at all levels Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 1/6] mm: Move common part of pagetable_*_ctor to helper Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 2/6] parisc: mm: Ensure pagetable_pmd_[cd]tor are called Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 3/6] m68k: mm: Add calls to pagetable_pmd_[cd]tor Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 4/6] ARM: mm: Rename PGD helpers Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 5/6] asm-generic: pgalloc: Provide generic __pgd_{alloc,free} Kevin Brodsky
2025-01-03 18:44 ` [PATCH v2 6/6] mm: Introduce ctor/dtor at PGD level Kevin Brodsky
2025-01-21 16:37 ` Alexander Gordeev
2025-01-22 7:49 ` Heiko Carstens
2025-01-22 14:06 ` Alexander Gordeev
2025-01-22 21:16 ` Alexander Gordeev
2025-01-06 8:38 ` [PATCH v2 0/6] Account page tables at all levels Qi Zheng
2025-01-07 9:15 ` Kevin Brodsky
2025-02-03 19:15 ` patchwork-bot+linux-riscv
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).