[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 4/7] xen/page_alloc: Add node argument to domain_{adjust_tot_pages,set_outstanding_pages}()
domain_adjust_tot_pages() adjusts the total pages of a domain after allocating or freeing memory. When allocating, it also reduces the outstanding claims of a domain as pages are allocated. When adding the node argument, we pass the node from which the pages were allocated. When pages are freed, we simply pass NUMA_NO_NODE as when freeing, the outstanding claims are not updated anyways. domain_set_outstanding_pages() sets the amount of outstanding claims of a domain. We pass the node on which to to stake an claim, or NUMA_NO_NODE for host-wide claims. No functional change, as neither function uses the arguments for anything yet. It's a prerequisite to simplify for the next patch that introduces per-node claim counts. Changed since v1: - Fix for the correct indentation of line with '-dec_count));' Signed-off-by: Bernhard Kaindl <bernhard.kaindl@xxxxxxxxx> Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@xxxxxxx> --- xen/arch/x86/mm.c | 3 ++- xen/arch/x86/mm/mem_sharing.c | 4 ++-- xen/common/domain.c | 2 +- xen/common/grant_table.c | 4 ++-- xen/common/memory.c | 6 ++++-- xen/common/page_alloc.c | 17 ++++++++++++----- xen/include/xen/mm.h | 6 ++++-- 7 files changed, 27 insertions(+), 15 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index e7fd56c7ce..effc67c6ba 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4444,7 +4444,8 @@ int steal_page( page_list_del(page, &d->page_list); /* Unlink from original owner. */ - if ( !(memflags & MEMF_no_refcount) && !domain_adjust_tot_pages(d, -1) ) + if ( !(memflags & MEMF_no_refcount) && + !domain_adjust_tot_pages(d, NUMA_NO_NODE, -1) ) drop_dom_ref = true; nrspin_unlock(&d->page_alloc_lock); diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c index da28266ef0..2551c0d86e 100644 --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -720,7 +720,7 @@ static int page_make_sharable(struct domain *d, if ( !validate_only ) { page_set_owner(page, dom_cow); - drop_dom_ref = !domain_adjust_tot_pages(d, -1); + drop_dom_ref = !domain_adjust_tot_pages(d, NUMA_NO_NODE, -1); page_list_del(page, &d->page_list); } @@ -766,7 +766,7 @@ static int page_make_private(struct domain *d, struct page_info *page) ASSERT(page_get_owner(page) == dom_cow); page_set_owner(page, d); - if ( domain_adjust_tot_pages(d, 1) == 1 ) + if ( domain_adjust_tot_pages(d, page_to_nid(page), 1) == 1 ) get_knownalive_domain(d); page_list_add_tail(page, &d->page_list); nrspin_unlock(&d->page_alloc_lock); diff --git a/xen/common/domain.c b/xen/common/domain.c index 5241a1629e..1beadb05e1 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -1239,7 +1239,7 @@ int domain_kill(struct domain *d) rspin_barrier(&d->domain_lock); argo_destroy(d); vnuma_destroy(d->vnuma); - domain_set_outstanding_pages(d, 0); + domain_set_outstanding_pages(d, NUMA_NO_NODE, 0); /* fallthrough */ case DOMDYING_dying: rc = domain_teardown(d); diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index cf131c43a1..8fea75dbb2 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -2405,7 +2405,7 @@ gnttab_transfer( } /* Okay, add the page to 'e'. */ - if ( unlikely(domain_adjust_tot_pages(e, 1) == 1) ) + if ( unlikely(domain_adjust_tot_pages(e, page_to_nid(page), 1) == 1) ) get_knownalive_domain(e); /* @@ -2431,7 +2431,7 @@ gnttab_transfer( * page in the page total */ nrspin_lock(&e->page_alloc_lock); - drop_dom_ref = !domain_adjust_tot_pages(e, -1); + drop_dom_ref = !domain_adjust_tot_pages(e, NUMA_NO_NODE, -1); nrspin_unlock(&e->page_alloc_lock); if ( okay /* i.e. e->is_dying due to the surrounding if() */ ) diff --git a/xen/common/memory.c b/xen/common/memory.c index 3688e6dd50..b8cf4bd23d 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -775,7 +775,8 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg) nrspin_lock(&d->page_alloc_lock); drop_dom_ref = (dec_count && - !domain_adjust_tot_pages(d, -dec_count)); + !domain_adjust_tot_pages(d, NUMA_NO_NODE, + -dec_count)); nrspin_unlock(&d->page_alloc_lock); if ( drop_dom_ref ) @@ -1682,7 +1683,8 @@ long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) rc = xsm_claim_pages(XSM_PRIV, d); if ( !rc ) - rc = domain_set_outstanding_pages(d, reservation.nr_extents); + rc = domain_set_outstanding_pages(d, NUMA_NO_NODE, + reservation.nr_extents); rcu_unlock_domain(d); diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index 43de9296fd..e8ba21dc46 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -517,7 +517,8 @@ static unsigned long avail_heap_pages( * Update the total number of pages and outstanding claims of a domain. * - When pages were freed, we do not increase outstanding claims. */ -unsigned long domain_adjust_tot_pages(struct domain *d, long pages) +unsigned long domain_adjust_tot_pages(struct domain *d, nodeid_t node, + long pages) { unsigned long adjustment; @@ -550,7 +551,8 @@ out: return d->tot_pages; } -int domain_set_outstanding_pages(struct domain *d, unsigned long pages) +int domain_set_outstanding_pages(struct domain *d, nodeid_t node, + unsigned long pages) { int ret = -ENOMEM; unsigned long avail_pages; @@ -2620,6 +2622,8 @@ int assign_pages( if ( !(memflags & MEMF_no_refcount) ) { + nodeid_t node = page_to_nid(&pg[0]); + if ( unlikely(d->tot_pages + nr < nr) ) { gprintk(XENLOG_INFO, @@ -2631,7 +2635,9 @@ int assign_pages( goto out; } - if ( unlikely(domain_adjust_tot_pages(d, nr) == nr) ) + ASSERT(node == page_to_nid(&pg[nr - 1])); + + if ( unlikely(domain_adjust_tot_pages(d, node, nr) == nr) ) get_knownalive_domain(d); } @@ -2764,7 +2770,8 @@ void free_domheap_pages(struct page_info *pg, unsigned int order) } } - drop_dom_ref = !domain_adjust_tot_pages(d, -(1 << order)); + drop_dom_ref = !domain_adjust_tot_pages(d, NUMA_NO_NODE, + -(1 << order)); rspin_unlock(&d->page_alloc_lock); @@ -2970,7 +2977,7 @@ void free_domstatic_page(struct page_info *page) arch_free_heap_page(d, page); - drop_dom_ref = !domain_adjust_tot_pages(d, -1); + drop_dom_ref = !domain_adjust_tot_pages(d, NUMA_NO_NODE, -1); unprepare_staticmem_pages(page, 1, scrub_debug); diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h index 93c037d618..f977e73b1c 100644 --- a/xen/include/xen/mm.h +++ b/xen/include/xen/mm.h @@ -65,6 +65,7 @@ #include <xen/compiler.h> #include <xen/mm-frame.h> #include <xen/mm-types.h> +#include <xen/numa.h> #include <xen/types.h> #include <xen/list.h> #include <xen/spinlock.h> @@ -130,8 +131,9 @@ mfn_t xen_map_to_mfn(unsigned long va); int populate_pt_range(unsigned long virt, unsigned long nr_mfns); /* Claim handling */ unsigned long __must_check domain_adjust_tot_pages(struct domain *d, - long pages); -int domain_set_outstanding_pages(struct domain *d, unsigned long pages); + nodeid_t node, long pages); +int domain_set_outstanding_pages(struct domain *d, nodeid_t node, + unsigned long pages); void get_outstanding_claims(uint64_t *free_pages, uint64_t *outstanding_pages); /* Domain suballocator. These functions are *not* interrupt-safe.*/ -- 2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |