Re: [PATCH v5 2/3] arm64: mmu: avoid allocating pages while splitting the linear mapping
From: Will Deacon <will@kernel.org>
Date: 2026-01-19 17:29:02
Also in:
linux-rt-devel, lkml
On Mon, Jan 05, 2026 at 08:23:27PM +0000, Yeoreum Yun wrote:
+static int __init linear_map_prealloc_split_pgtables(void)
+{
+ int ret, i;
+ unsigned long lstart = _PAGE_OFFSET(vabits_actual);
+ unsigned long lend = PAGE_END;
+ unsigned long kstart = (unsigned long)lm_alias(_stext);
+ unsigned long kend = (unsigned long)lm_alias(__init_begin);
+
+ const struct mm_walk_ops collect_to_split_ops = {
+ .pud_entry = collect_to_split_pud_entry,
+ .pmd_entry = collect_to_split_pmd_entry
+ };Why do we need to rewalk the page-table here instead of collating the number of block mappings we put down when creating the linear map in the first place?
+ split_pgtables_idx = 0;
+ split_pgtables_count = 0;
+
+ ret = walk_kernel_page_table_range_lockless(lstart, kstart,
+ &collect_to_split_ops,
+ NULL, NULL);
+ if (!ret)
+ ret = walk_kernel_page_table_range_lockless(kend, lend,
+ &collect_to_split_ops,
+ NULL, NULL);
+ if (ret || !split_pgtables_count)
+ goto error;
+
+ ret = -ENOMEM;
+
+ split_pgtables = kvmalloc(split_pgtables_count * sizeof(struct ptdesc *),
+ GFP_KERNEL | __GFP_ZERO);
+ if (!split_pgtables)
+ goto error;
+
+ for (i = 0; i < split_pgtables_count; i++) {
+ /* The page table will be filled during splitting, so zeroing it is unnecessary. */
+ split_pgtables[i] = pagetable_alloc(GFP_PGTABLE_KERNEL & ~__GFP_ZERO, 0);
+ if (!split_pgtables[i])
+ goto error;This looks potentially expensive on the boot path and only gets worse as the amount of memory grows. Maybe we should predicate this preallocation on preempt-rt? Will