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

[PATCH v2 12/24] tools/libs/guest: Allocate vNUMA memory from associated pNUMA nodes


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Hirokazu Takahashi <taka@xxxxxxxxxxxxx>
  • Date: Mon, 1 Jun 2026 07:47:42 +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=h1fpEhty/L0qcXw9KcXU8OLmSzP52ezRWu7E5NXmfus=; b=dHb2LgQS8Gni1HzEbE4mUDHK8TrYvJ4ecp4bjGk6dPowI2xTIMF6+X1RD7Hitg8WQyhMI2PzOfX98wEtxk/1BdViS3hMNf1hp0xz068vOJMdC4xpWSYT4G8INjxS16B4Du6M47nls3nQFmHnINNE4oNJ6Y019I6Am9GfQMSi8tfmkZhSdtzeA5fICcOp23qjaKf4FHn5mAWadPBHtr2MX6peTwZBffTc+E/3vMxLkHy0wJi/xeTa9shZccgjLjWDTlO2zSuFdtfQub24RvztO7Dua4J8A/CTK1qxhfnEEU7E0nrJmX94/YhiUP6c5p/4a7aIP4kY9YJBwiNrnndLMQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GhzpwkBhKvbFzTNhACp5SEuTeee9C7hhyt/3Ppih9lX8sSezcpXvsz0P6oPiLU0T4KmwxFtIEZD72SYGwmYBmB6il6wZYL7FB0ZahEZGodg9ZGNsvoaA0n9S6Ln5U9mSrsoJB1KNlyWzAY5GqSnui+8C+YZJyu6xITzMlyB+4Zj10V+dsWiESJTJ+LXqmZPpdtL7xkrQ5jkfChPYFkV1ErgiQ6tR5VjimBuRvkLXu0PM3a0YYuNLb+1bcwa2nWOdJodaOmBE345wXQXAI1WfqI71nxGydUuANzVeECnBYI9XzOSf+MSiFdEbOcf99/kPQ2DEOC8FssG1fazmrdIysQ==
  • 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: Hirokazu Takahashi <taka@xxxxxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Juergen Gross <jgross@xxxxxxxx>
  • Delivery-date: Sun, 31 May 2026 22:48:34 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Allocate memory for domU vNUMA nodes from the physical NUMA
nodes specified in the domU configuration file.
---
 tools/libs/guest/xg_dom_arm.c | 62 +++++++++++++++++++++++++++--------
 1 file changed, 49 insertions(+), 13 deletions(-)

diff --git a/tools/libs/guest/xg_dom_arm.c b/tools/libs/guest/xg_dom_arm.c
index c8d0918506..6beab17e48 100644
--- a/tools/libs/guest/xg_dom_arm.c
+++ b/tools/libs/guest/xg_dom_arm.c
@@ -236,7 +236,7 @@ static int set_mode(xc_interface *xch, uint32_t domid, 
const char *guest_type)
  */
 static int populate_one_size(struct xc_dom_image *dom, int pfn_shift,
                              xen_pfn_t base_pfn, xen_pfn_t *nr_pfns,
-                             xen_pfn_t *extents)
+                             xen_pfn_t *extents, unsigned int memflags)
 {
     /* The mask for this level */
     const uint64_t mask = ((uint64_t)1<<(pfn_shift))-1;
@@ -274,7 +274,7 @@ static int populate_one_size(struct xc_dom_image *dom, int 
pfn_shift,
         extents[i] = base_pfn + (i<<pfn_shift);
 
     nr = xc_domain_populate_physmap(dom->xch, dom->guest_domid, count,
-                                    pfn_shift, 0, extents);
+                                    pfn_shift, memflags, extents);
     if ( nr <= 0 ) return nr;
     DOMPRINTF("%s: populated %#x/%#x entries with shift %d",
               __FUNCTION__, nr, count, pfn_shift);
@@ -285,10 +285,12 @@ static int populate_one_size(struct xc_dom_image *dom, 
int pfn_shift,
 }
 
 static int populate_guest_memory(struct xc_dom_image *dom,
-                                 xen_pfn_t base_pfn, xen_pfn_t nr_pfns)
+                                 xen_pfn_t base_pfn, xen_pfn_t nr_pfns,
+                                 unsigned int nid)
 {
     int rc = 0;
     xen_pfn_t allocsz, pfn, *extents;
+    unsigned int memflags = 0U;
 
     extents = calloc(1024*1024,sizeof(xen_pfn_t));
     if ( extents == NULL )
@@ -303,6 +305,16 @@ static int populate_guest_memory(struct xc_dom_image *dom,
               (uint64_t)(base_pfn + nr_pfns) << XC_PAGE_SHIFT,
               (uint64_t)nr_pfns >> (20-XC_PAGE_SHIFT));
 
+    if ( dom->nr_vmemranges > 0 )
+    {
+        memflags = XENMEMF_exact_node(dom->vnode_to_pnode[nid]);
+
+        DOMPRINTF("%s:     on pNODE%u for vNODE%u",
+              __FUNCTION__,
+              dom->vnode_to_pnode[nid],
+              nid);
+    }
+
     for ( pfn = 0; pfn < nr_pfns; pfn += allocsz )
     {
         allocsz = min_t(int, 1024*1024, nr_pfns - pfn);
@@ -312,7 +324,7 @@ static int populate_guest_memory(struct xc_dom_image *dom,
         {
             allocsz = 1;
             rc = populate_one_size(dom, PFN_4K_SHIFT,
-                                   base_pfn + pfn, &allocsz, extents);
+                                   base_pfn + pfn, &allocsz, extents, 
memflags);
             if (rc < 0) break;
             if (rc > 0) continue;
             /* Failed to allocate a single page? */
@@ -321,22 +333,22 @@ static int populate_guest_memory(struct xc_dom_image *dom,
 #endif
 
         rc = populate_one_size(dom, PFN_512G_SHIFT,
-                               base_pfn + pfn, &allocsz, extents);
+                               base_pfn + pfn, &allocsz, extents, memflags);
         if ( rc < 0 ) break;
         if ( rc > 0 ) continue;
 
         rc = populate_one_size(dom, PFN_1G_SHIFT,
-                               base_pfn + pfn, &allocsz, extents);
+                               base_pfn + pfn, &allocsz, extents, memflags);
         if ( rc < 0 ) break;
         if ( rc > 0 ) continue;
 
         rc = populate_one_size(dom, PFN_2M_SHIFT,
-                               base_pfn + pfn, &allocsz, extents);
+                               base_pfn + pfn, &allocsz, extents, memflags);
         if ( rc < 0 ) break;
         if ( rc > 0 ) continue;
 
         rc = populate_one_size(dom, PFN_4K_SHIFT,
-                               base_pfn + pfn, &allocsz, extents);
+                               base_pfn + pfn, &allocsz, extents, memflags);
         if ( rc < 0 ) break;
         if ( rc == 0 )
         {
@@ -415,12 +427,36 @@ static int meminit(struct xc_dom_image *dom)
     assert(ramsize == 0); /* Too much RAM is rejected above */
 
     /* setup initial p2m and allocate guest memory */
-    for ( i = 0; i < GUEST_RAM_BANKS && dom->rambank_size[i]; i++ )
+    if ( dom->nr_vmemranges > 0 )
     {
-        if ((rc = populate_guest_memory(dom,
-                                        bankbase[i] >> XC_PAGE_SHIFT,
-                                        dom->rambank_size[i])))
-            return rc;
+        ramsize = (uint64_t)dom->total_pages << XC_PAGE_SHIFT;
+
+        for ( i = 0; i < dom->nr_vmemranges; i++ )
+        {
+            ramsize -= dom->vmemranges[i].end - dom->vmemranges[i].start;
+        }
+
+        assert(ramsize == 0);
+
+        for ( i = 0; i < dom->nr_vmemranges; i++ )
+        {
+            if ((rc = populate_guest_memory(dom,
+                    dom->vmemranges[i].start  >> XC_PAGE_SHIFT,
+                    (dom->vmemranges[i].end - dom->vmemranges[i].start) >> 
XC_PAGE_SHIFT,
+                    dom->vmemranges[i].nid)))
+                return rc;
+        }
+    }
+    else
+    {
+        for ( i = 0; i < GUEST_RAM_BANKS && dom->rambank_size[i]; i++ )
+        {
+            if ((rc = populate_guest_memory(dom,
+                                            bankbase[i] >> XC_PAGE_SHIFT,
+                                            dom->rambank_size[i],
+                                            0U)))
+                return rc;
+        }
     }
 
     /*
-- 
2.43.0




 


Rackspace

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