|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/5] xen/mm: alloc pages: Allow free pages to cover a shortfall of claims
When an allocation has a shortfall of claims but free, unclaimed
memory can cover this shortfall, allow the allocation to proceed.
In preparation for NUMA claims, refactor this check into a reusable
function. This will enable the same logic to be applied for NUMA nodes.
Suggested-by: Jan Beulich <jbeulich@xxxxxxxx>
Signed-off-by: Bernhard Kaindl <bernhard.kaindl@xxxxxxxxxx>
---
Changes since v4: Extracted into a dedicated patch and merged the
formerly separate functions into one, as suggested by Jan Beulich.
Signed-off-by: Bernhard Kaindl <bernhard.kaindl@xxxxxxxxxx>
---
xen/common/page_alloc.c | 41 ++++++++++++++++++++++++++++++++++++++---
1 file changed, 38 insertions(+), 3 deletions(-)
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 3b0909cc3ce1..0fab1630e318 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -873,6 +873,42 @@ static void check_and_stop_scrub(struct page_info *head)
}
}
+/*
+ * Allow the request when unclaimed pages suffice, or when a refcounted
+ * domain's outstanding claims cover the shortfall.
+ */
+static bool claims_permit_request(const struct domain *d,
+ unsigned long avail_pages,
+ unsigned long competing_claims,
+ unsigned int memflags,
+ unsigned long requested_pages)
+{
+ unsigned long unclaimed_pages;
+
+ ASSERT(spin_is_locked(&heap_lock));
+ ASSERT(avail_pages >= competing_claims);
+
+ /* Start from the free pages not already claimed by other domains. */
+ unclaimed_pages = avail_pages - competing_claims;
+
+ /* Allow the request to proceed when unclaimed pages suffice. */
+ if ( requested_pages <= unclaimed_pages )
+ return true;
+
+ /*
+ * If unclaimed pages are insufficient, only a refcounted domain allocation
+ * may use claims to cover the shortfall.
+ */
+ if ( !d || (memflags & MEMF_no_refcount) )
+ return false;
+
+ /*
+ * Allow the request to proceed when combination of unclaimed pages and the
+ * claims held by the domain cover the shortfall for the requested_pages.
+ */
+ return requested_pages <= unclaimed_pages + d->outstanding_pages;
+}
+
static struct page_info *get_free_buddy(unsigned int zone_lo,
unsigned int zone_hi,
unsigned int order, unsigned int
memflags,
@@ -1017,9 +1053,8 @@ static struct page_info *alloc_heap_pages(
* Claimed memory is considered unavailable unless the request
* is made by a domain with sufficient unclaimed pages.
*/
- if ( (outstanding_claims + request > total_avail_pages) &&
- ((memflags & MEMF_no_refcount) ||
- !d || d->outstanding_pages < request) )
+ if ( !claims_permit_request(d, total_avail_pages, outstanding_claims,
+ memflags, request) )
{
spin_unlock(&heap_lock);
return NULL;
--
2.39.5
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |