|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 3/5] xen/mm: Optimise getting free page counts per NUMA node
From: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx> Introduce per-node free page counters which enhance the efficiency of avail_node_heap_pages(): - It no longer needs to iterate over all zones of a node. - It is utilised by the numainfo hypercall and the debug-key 'u' to display NUMA information in the printk buffer - This aggregate will be needed for the node-specific claims feature to determine the number of free pages in a node in the hot path of get_free_buddy() without looping over all zones of a node. Signed-off-by: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx> Signed-off-by: Bernhard Kaindl <bernhard.kaindl@xxxxxxxxxx> --- Applied Jan's review: https://lists.xenproject.org/archives/html/xen-devel/2026-03/msg00144.html Changes: - Removed accessor macro - Abandoned conversion to unsigned long --- xen/common/page_alloc.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index 0fab1630e318..95bae26d1c1f 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -485,7 +485,20 @@ static unsigned long node_need_scrub[MAX_NUMNODES]; static unsigned long *avail[MAX_NUMNODES]; static long total_avail_pages; +/* + * Sum of the free pages in all zones of that node. + * Provided via sysctl by NUMA node placement decisions of domain builders and + * for monitoring. It is also logged with debug-key 'u' for NUMA debugging. + */ +static long node_avail_pages[MAX_NUMNODES]; +/* + * The global heap lock, protecting access to the heap and related structures. + * It protects the heap and claims of the buddy allocator and d->*claims. + * The locking order is: d->page_alloc_lock (optional) -> heap_lock + * - Numerous external callers holding d->page_alloc_lock call functions + * taking the heap_lock. Note: Violating it would cause an ABBA deadlock. + */ static DEFINE_SPINLOCK(heap_lock); static long outstanding_claims; /* total outstanding claims by all domains */ @@ -1097,6 +1110,8 @@ static struct page_info *alloc_heap_pages( } } + ASSERT(node_avail_pages[node] >= request); + node_avail_pages[node] -= request; ASSERT(avail[node][zone] >= request); avail[node][zone] -= request; total_avail_pages -= request; @@ -1287,6 +1302,7 @@ static int reserve_offlined_page(struct page_info *head) if ( !page_state_is(cur_head, offlined) ) continue; + node_avail_pages[node]--; avail[node][zone]--; total_avail_pages--; ASSERT(total_avail_pages >= 0); @@ -1611,6 +1627,7 @@ static void free_heap_pages( } } + node_avail_pages[node] += 1 << order; avail[node][zone] += 1 << order; total_avail_pages += 1 << order; if ( need_scrub ) @@ -2878,7 +2895,7 @@ unsigned long avail_domheap_pages_region( unsigned long avail_node_heap_pages(unsigned int nodeid) { - return avail_heap_pages(MEMZONE_XEN, NR_ZONES -1, nodeid); + return node_avail_pages[nodeid]; } -- 2.39.5
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |