[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [mini-os master] mm: provide a way to do very early page table allocations
commit ba260dc134aa360da719e1932af05a743a3db18f Author: Juergen Gross <jgross@xxxxxxxx> AuthorDate: Tue Jul 29 11:22:53 2025 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Jul 29 11:22:53 2025 +0200 mm: provide a way to do very early page table allocations Add a small pool of statically allocated memory pages to be handed out for very early page table allocations. This will make it possible to do virtual allocations e.g. for mapping the shared info page. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- arch/x86/mm.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/arch/x86/mm.c b/arch/x86/mm.c index ebc85e0..995508c 100644 --- a/arch/x86/mm.c +++ b/arch/x86/mm.c @@ -640,13 +640,20 @@ void change_readonly(bool readonly) /* * return a valid PTE for a given virtual address. If PTE does not exist, * allocate page-table pages. + * Provide a small pool for allocating some page tables very early. Those are + * needed currently for mapping the shared info page, so 3 pages ought to be + * enough. Add one spare page anyway. */ +static char early_pt[4][PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); +static unsigned int n_early_pt = ARRAY_SIZE(early_pt); + static int need_pgt_func(unsigned long va, unsigned int lvl, bool is_leaf, pgentry_t *pte, void *par) { pgentry_t **result = par; unsigned long pt_mfn; unsigned long pt_pfn; + unsigned long pt_addr; unsigned int idx; if ( !is_leaf ) @@ -665,7 +672,11 @@ static int need_pgt_func(unsigned long va, unsigned int lvl, bool is_leaf, } pt_mfn = virt_to_mfn(pte); - pt_pfn = virt_to_pfn(alloc_page()); + if ( n_early_pt ) + pt_addr = (unsigned long)early_pt[--n_early_pt]; + else + pt_addr = alloc_page(); + pt_pfn = virt_to_pfn(pt_addr); if ( !pt_pfn ) return -1; idx = idx_from_va_lvl(va, lvl); -- generated by git-patchbot for /home/xen/git/mini-os.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |