|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 21/36] xen/common: add colored allocator initialization
On 04.03.2022 18:46, Marco Solieri wrote:
> From: Luca Miccio <lucmiccio@xxxxxxxxx>
>
> Initialize colored heap and allocator data structures. It is assumed
> that pages are given to the init function is in ascending order.
I don't think this is a good assumption to make.
> To
> ensure that, pages are retrieved from bootmem_regions starting from the
> first one. Moreover, this allows quickly insertion of freed pages into
> the colored allocator's internal data structures -- sorted lists.
I wouldn't call insertion by linear scan "quick", to be honest.
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -2154,11 +2154,26 @@ void __init end_boot_allocator(void)
> break;
> }
> }
> - for ( i = nr_bootmem_regions; i-- > 0; )
> +
> + for ( i = 0; i < nr_bootmem_regions; i++ )
> {
> struct bootmem_region *r = &bootmem_region_list[i];
> - if ( r->s < r->e )
> - init_heap_pages(mfn_to_page(_mfn(r->s)), r->e - r->s);
> +
> + /*
> + * Find the first region that can fill the buddy allocator memory
> + * specified by buddy_required_size.
> + */
Why would all of this memory need to come from a single region? And
why would any region - regardless of address - be okay?
> + if ( buddy_required_size && (r->e - r->s) >
> + PFN_DOWN(buddy_required_size) )
I think >= will do here?
Also - nit: Indentation.
> + {
> + init_heap_pages(mfn_to_page(_mfn(r->s)),
> + PFN_DOWN(buddy_required_size));
And again - indentation.
> + r->s += PFN_DOWN(buddy_required_size);
> + buddy_required_size = 0;
> + }
> +
> + init_col_heap_pages(mfn_to_page(_mfn(r->s)), r->e - r->s);
Judging from this, buddy_required_size can actually be __initdata in
the previous patch. Being able to spot such is another reason to not
split patches like this.
> @@ -2619,9 +2634,12 @@ int assign_pages(
> page_set_owner(&pg[i], d);
> smp_wmb(); /* Domain pointer must be visible before updating refcnt.
> */
> pg[i].count_info =
> - (pg[i].count_info & (PGC_extra | PGC_reserved)) | PGC_allocated
> | 1;
> + (pg[i].count_info & (PGC_extra | PGC_reserved)) | PGC_allocated
> | 1;
Why the change?
> @@ -2642,6 +2660,15 @@ struct page_info *alloc_domheap_pages(
> unsigned int bits = memflags >> _MEMF_bits, zone_hi = NR_ZONES - 1;
> unsigned int dma_zone;
>
> + /* Only Dom0 and DomUs are supported for coloring */
> + if ( d && d->max_colors > 0 )
> + {
> + /* Colored allocation must be done on 0 order */
> + if (order)
Nit: Missing blanks.
> @@ -2761,8 +2788,10 @@ void free_domheap_pages(struct page_info *pg, unsigned
> int order)
> scrub = 1;
> }
>
> - free_heap_pages(pg, order, scrub);
> - }
> + if ( is_page_colored(pg) )
> + free_col_heap_page(pg);
> + else
> + free_heap_pages(pg, order, scrub);}
Very interesting brace placement.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |