[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [MINI-OS PATCH 1/2] mm: provide a way to do very early page table allocations
On 08.07.2025 08:37, Juergen Gross wrote: > 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> > --- > arch/x86/mm.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/mm.c b/arch/x86/mm.c > index bdff38fd..3f5c7ea7 100644 > --- a/arch/x86/mm.c > +++ b/arch/x86/mm.c > @@ -640,12 +640,17 @@ void change_readonly(bool readonly) > * return a valid PTE for a given virtual address. If PTE does not exist, > * allocate page-table pages. > */ > +#define N_PTS 4 Wouldn't it be prudent to have a comment here mentioning how this number was derived, i.e. what's known to be covered? (To map the shared info page I expect you really only need 3? Hence without a comment things may remain unclear.) > +static char early_pt[PAGE_SIZE * N_PTS] __attribute__((aligned(PAGE_SIZE))); Maybe better early_pt[N_PTS][PAGE_SIZE], simplifying the allocation code below a little? > +static unsigned long n_early_pt = N_PTS; unsigned int would do, I expect? With the suggestion above this could then also use ARRAY_SIZE(), at which point there would be no real need for N_PTS anymore. > 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 ) > @@ -664,7 +669,16 @@ 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 ) > + { > + n_early_pt--; > + pt_addr = (unsigned long)&early_pt[n_early_pt * PAGE_SIZE]; > + } > + else > + { > + pt_addr = alloc_page(); > + } The failure pattern when one fails to increase early_pt[] is likely going to be problematic. Wouldn't it be better to check for failure here? Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |