|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 06/11] xen/page_alloc: Hook per-node claims to alloc_heap_pages()
On Fri, Mar 14, 2025 at 05:24:57PM +0000, Alejandro Vallejo wrote:
> Extend the claim checks in alloc_heap_pages() to exact-node claims. The
> logic is slightly more complicated, so the patch moves it all to an
> auxiliary function.
>
> exact-node claims also follow global claims in order to ensure both can
> coexist in the same system.
>
> Signed-off-by: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx>
> ---
> xen/common/page_alloc.c | 44 ++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 41 insertions(+), 3 deletions(-)
>
> diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
> index 7fe574b29407..cfaa64d3b858 100644
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -991,6 +991,46 @@ static void init_free_page_fields(struct page_info *pg)
> page_set_owner(pg, NULL);
> }
>
> +/*
> + * Determine whether a heap allocation is allowed after considering all
> + * outstanding claims in the system.
> + *
> + * Exact-node allocations must also take into account global claims!
> + *
> + * e.g:
> + * Consider a domain for which toolstack issued a non-exact claim of 75% of
> + * host memory and another domain for which toolstack tries to issue an
> + * exact-node claim of 50% of host memory. If the exact claim didn't
> consider
> + * non-exact claims too we would overallocate, which is exactly what claims
s/overallocate/overclaim/ or maybe "attempt to overallocate".
> + * are trying to prevent.
> + */
> +static bool can_alloc(struct domain *d, unsigned int memflags,
d can be const here, this helper is just a checker that doesn't modify
anything.
> + unsigned long request)
> +{
> + nodeid_t node = (memflags & MEMF_exact_node) ? MEMF_get_node(memflags) :
> + NUMA_NO_NODE;
> +
> + if ( outstanding_claims + request <= total_avail_pages )
> + {
> + if ( node == NUMA_NO_NODE )
> + return true;
> +
> + if ( pernode_oc[node] + request <= pernode_avail_pages[node] )
> + return true;
> + }
You can possibly join all conditions in a single clause?
if ( outstanding_claims + request <= total_avail_pages &&
(node == NUMA_NO_NODE ||
pernode_oc[node] + request <= pernode_avail_pages[node]) )
return true;
> +
> + /*
> + * Not enough unclaimed memory. Only allow if it's already claimed on the
> + * right node. d->claim_node == NUMA_NO_NODE if the claim isn't on an
> + * exact node.
> + *
> + * Only refcounted allocs attributed to domains may have been claimed
Nit: missing full stop at the end of the sentence.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |