|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/6] xen/arm: do not free reserved memory into heap
On 18.04.2022 14:22, Penny Zheng wrote:
> Pages as guest RAM for static domain, shall be reserved to this domain only.
Is there "used" missing as the 2nd word of the sentence?
> So in case reserved pages being used for other purpose, users
> shall not free them back to heap, even when last ref gets dropped.
>
> free_staticmem_pages will be called by free_domheap_pages in runtime
> for static domain freeing memory resource, so let's drop the __init
> flag.
>
> Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
> ---
> v2 changes:
> - new commit
> ---
> xen/common/page_alloc.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
With this diffstat the patch subject prefix is somewhat misleading;
I first thought I could skip this patch.
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -2488,7 +2488,13 @@ void free_domheap_pages(struct page_info *pg, unsigned
> int order)
> scrub = 1;
> }
>
> - free_heap_pages(pg, order, scrub);
> +#ifdef CONFIG_STATIC_MEMORY
> + if ( pg->count_info & PGC_reserved )
> + /* Reserved page shall not go back to the heap. */
> + free_staticmem_pages(pg, 1 << order, scrub);
1UL with, in particular, the function parameter by "unsigned long".
By calling free_staticmem_pages() at runtime, you make the previous race
free (because of init-time only) update of .count_info there racy. Making
a clone of that function just for this difference would likely be
excessive, so I'd suggest to change the code there to
/* In case initializing page of static memory, mark it PGC_reserved. */
if ( !(pg[i].count_info & PGC_reserved) )
pg[i].count_info |= PGC_reserved;
> + else
> +#endif
> + free_heap_pages(pg, order, scrub);
Of course it would be nice to avoid the #ifdef-ary here. May I ask
that you introduce a stub free_staticmem_pages() for the
!CONFIG_STATIC_MEMORY case, such that the construct can become
if ( !(pg->count_info & PGC_reserved) )
free_heap_pages(pg, order, scrub);
else
/* Reserved page shall not go back to the heap. */
free_staticmem_pages(pg, 1 << order, scrub);
Another question is whether the distinction should be made here in
the first place. Would it perhaps better belong in free_heap_pages()
itself, thus also covering other potential call sites? Of course
this depends on where, long term, reserved pages can / will be used.
For domains to be truly static, Xen's own allocations to manage the
domain may also want to come from the reserved set ...
> @@ -2636,7 +2642,7 @@ struct domain *get_pg_owner(domid_t domid)
>
> #ifdef CONFIG_STATIC_MEMORY
> /* Equivalent of free_heap_pages to free nr_mfns pages of static memory. */
> -void __init free_staticmem_pages(struct page_info *pg, unsigned long nr_mfns,
> +void free_staticmem_pages(struct page_info *pg, unsigned long nr_mfns,
> bool need_scrub)
This line now wants its indentation adjusted.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |