[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 7/9] xen/arm: unpopulate memory when domain is static
On Tue, 31 May 2022, Penny Zheng wrote: > Today when a domain unpopulates the memory on runtime, they will always > hand the memory back to the heap allocator. And it will be a problem if domain > is static. > > Pages as guest RAM for static domain shall be reserved to only this domain > and not be used for any other purposes, so they shall never go back to heap > allocator. > > This commit puts reserved pages on the new list resv_page_list only after > having taken them off the "normal" list, when the last ref dropped. > > Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx> ARM bits: Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > v5 changes: > - adapt this patch for PGC_staticmem > --- > v4 changes: > - no changes > --- > v3 changes: > - have page_list_del() just once out of the if() > - remove resv_pages counter > - make arch_free_heap_page be an expression, not a compound statement. > --- > v2 changes: > - put reserved pages on resv_page_list after having taken them off > the "normal" list > --- > xen/arch/arm/include/asm/mm.h | 12 ++++++++++++ > xen/common/domain.c | 4 ++++ > xen/include/xen/sched.h | 3 +++ > 3 files changed, 19 insertions(+) > > diff --git a/xen/arch/arm/include/asm/mm.h b/xen/arch/arm/include/asm/mm.h > index 56d0939318..ca384a3939 100644 > --- a/xen/arch/arm/include/asm/mm.h > +++ b/xen/arch/arm/include/asm/mm.h > @@ -360,6 +360,18 @@ void clear_and_clean_page(struct page_info *page); > > unsigned int arch_get_dma_bitsize(void); > > +/* > + * Put free pages on the resv page list after having taken them > + * off the "normal" page list, when pages from static memory > + */ > +#ifdef CONFIG_STATIC_MEMORY > +#define arch_free_heap_page(d, pg) ({ \ > + page_list_del(pg, page_to_list(d, pg)); \ > + if ( (pg)->count_info & PGC_staticmem ) \ > + page_list_add_tail(pg, &(d)->resv_page_list); \ > +}) > +#endif > + > #endif /* __ARCH_ARM_MM__ */ > /* > * Local variables: > diff --git a/xen/common/domain.c b/xen/common/domain.c > index a3ef991bd1..a49574fa24 100644 > --- a/xen/common/domain.c > +++ b/xen/common/domain.c > @@ -604,6 +604,10 @@ struct domain *domain_create(domid_t domid, > INIT_PAGE_LIST_HEAD(&d->page_list); > INIT_PAGE_LIST_HEAD(&d->extra_page_list); > INIT_PAGE_LIST_HEAD(&d->xenpage_list); > +#ifdef CONFIG_STATIC_MEMORY > + INIT_PAGE_LIST_HEAD(&d->resv_page_list); > +#endif > + > > spin_lock_init(&d->node_affinity_lock); > d->node_affinity = NODE_MASK_ALL; > diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h > index 5191853c18..3e22c77333 100644 > --- a/xen/include/xen/sched.h > +++ b/xen/include/xen/sched.h > @@ -381,6 +381,9 @@ struct domain > struct page_list_head page_list; /* linked list */ > struct page_list_head extra_page_list; /* linked list (size extra_pages) > */ > struct page_list_head xenpage_list; /* linked list (size xenheap_pages) > */ > +#ifdef CONFIG_STATIC_MEMORY > + struct page_list_head resv_page_list; /* linked list (size resv_pages) */ > +#endif > > /* > * This field should only be directly accessed by > domain_adjust_tot_pages() > -- > 2.25.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |