[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 16/21] xen/arm: Balance Dom0 vCPU assignment across NUMA nodes


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Hirokazu Takahashi <taka@xxxxxxxxxxxxx>
  • Date: Sun, 24 May 2026 09:02:04 +0900
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=IISNxGg7j9E7jMdBYWz59g/s/VxE99jHkjaKf+wwH+g=; b=Ut5opo5qzgaEVsx7G5N8xuDiYfy2Ln6pNCndAOV/x6jPwSIqhLbS2iZHb9zexnzNgqOdcuoFpOW2x1AZpokkKh1GrQiRaroLIAEqVGQcrztuUO0//zR7u5MiJshCU+Oivl4M4Vckh80sM+1i4kiqu5kcWpP/5hkE+0dL8bGN+MgzICv8YwpS2I86E/YE6ojWGu4qfVyxUy/fVOB3ztkEzUjRe3vcMMbT7CgXU8jLUTe3r4iX5oH7ktSDteIs2J8S/oo6Epg4nVQeIQGWsa2ck2BjvT/oeuaxDfzIkMTCWdQ8VEzDz+Ts7aaxW9QzEZclXLZB4cvUFKpzD8VvCfkTuw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WTqFtlx3L0XOA9timBkUv2ADg+Owsm9yef+zE3fnW61aczKrbYdMnjtmRVSrm/TBvqdrjetv0J/G990o9YPAJGU0cEJwnJTmto6WoNsrQSZTTF+L793ChFAdEznkYxxsVgwsNEYbtt8oiGvk3nYrxrmNSOlq5YH5FYxoi8/SV3lINjla3TfwUG8UXLW0hNGhy0BNS0Lv4XULMV2K41thtBKX9wO/kQDpmT/2JN6tXj4iuXjOhuNJwiSvO9I8oap82aFu04lDt7w+Ji5CJkC+bsieY3VC0fbUBkeieBf/F3jAr+GTsydYiEIYZdQG879SjD5aYcqMbPHmQx9qJTDExw==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=valinux.co.jp header.i="@valinux.co.jp" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp;
  • Cc: andrew.cooper3@xxxxxxxxxx, anthony.perard@xxxxxxxxxx, michal.orzel@xxxxxxx, jbeulich@xxxxxxxx, julien@xxxxxxx, roger.pau@xxxxxxxxxx, sstabellini@xxxxxxxxxx, jgross@xxxxxxxx, bertrand.marquis@xxxxxxx, Volodymyr_Babchuk@xxxxxxxx, dfaggioli@xxxxxxxx, gwd@xxxxxxxxxxxxxx, Hirokazu Takahashi <taka@xxxxxxxxxxxxx>
  • Delivery-date: Sun, 24 May 2026 00:03:08 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Configure the assignment of Dom0 vCPUs to NUMA nodes, aiming to balance
the compute load across the available nodes.
---
 xen/arch/arm/domain_build.c | 46 +++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 1deb4c1139..a62adafa19 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1225,6 +1225,34 @@ int __init make_psci_node(void *fdt)
     return res;
 }
 
+/*
+ * Map a Dom0 vCPU ID to a target NUMA node ID.
+ */
+static nodeid_t __init dom0_vcpu_to_node(const struct domain *d, unsigned int 
vcpu_id)
+{
+    nodeid_t nodes[MAX_NUMNODES];
+    unsigned int nr_nodes = 0;
+    unsigned int vcpus_per_node;
+    unsigned int node_idx;
+    nodeid_t n;
+
+    if ( nodes_empty(d->node_affinity) )
+        return 0;
+
+    for_each_node_mask(n, d->node_affinity)
+        nodes[nr_nodes++] = n;
+
+    if ( nr_nodes == 0 )
+        return 0;
+
+    vcpus_per_node = (d->max_vcpus + nr_nodes - 1) / nr_nodes;
+    node_idx = vcpu_id / vcpus_per_node;
+
+    ASSERT(node_idx < nr_nodes);
+
+    return nodes[node_idx];
+}
+
 int __init make_cpus_node(const struct domain *d, struct kernel_info *kinfo)
 {
     int res;
@@ -1907,6 +1935,24 @@ int __init construct_domain(struct domain *d, struct 
kernel_info *kinfo)
             vcpu_switch_to_aarch64_mode(d->vcpu[i]);
     }
 
+    /*
+     * If Dom0 has specific NUMA node affinity configured, bind each vCPU
+     * to its designated physical node.
+     */
+    for ( i = 0; i < d->max_vcpus; i++ )
+    {
+        struct vcpu *v = d->vcpu[i];
+        nodeid_t pnode;
+        const cpumask_t *nodemask;
+
+        if ( !v ) continue;
+
+        pnode = dom0_vcpu_to_node(d, i);
+        nodemask = &node_to_cpumask(pnode);
+
+        vcpu_set_hard_affinity(v, nodemask);
+    }
+
     domain_update_node_affinity(d);
 
     v->is_initialised = 1;
-- 
2.43.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.