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

[PATCH v1 1/3] xen/arm: generalize per-page GFN storage beyond xenheap pages


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>, <alejandro.garciavallejo@xxxxxxx>
  • From: Penny Zheng <Penny.Zheng@xxxxxxx>
  • Date: Fri, 27 Mar 2026 15:50:23 +0800
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • 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=YAfPwcQ9WQkre89jhdMSQOFTVOhS6f3es3Xfay/BKB8=; b=I2Rel786idscsezSDB46Ya8tfyx+y99eXMBzvM4J+SAj6Rb3UMPHo69+JqXUE9zmbNJYy3nP3rXp8Ov1/ZlLnBsAw/+XZ1iEkBasagKr/xAqsYjzmraIqGO1bl0wdR/rFZ0M1G5GKOnlN7mB5YGRxjeU/nLBTh+2pbpwjk8mgwgwFTds0cJ/AjKsi8OLNE/lN902hcpaTn6biJUB9ViwKxDBvvdr0TsQm95j4rYUqB/2mOX4Pyd3m/TjpmcXOC4WyMYW6vZKzj+rUvxQnvrJtSJ8obg7p8pTcvb92x1qoeYb1+TRq0C1i/YbRod5S619iyLk1U4SitYFwMDQPGY7Jw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=uNoEnqCNMGfN08G61n00dAavKvL08z0Delr1E2gLDi8QtHiRll6fy6nFRjHsLQpXoFLwHC+embdvi5JoDG57tRq/a1jZE4/IEit7L8qUyvqrjK/K3SIv2UprSiUwJgNoTpSu6XiTcRNcaEMJW/lAc4r0sI00l0xJSaaEFVHafCNfjFNAtg9bPcbrWhqP57cHn3FJNr/3yw/EevZP4+Ca+yqW12jH+WduzV+sTtCu7a57jmHLG8dnK2e5FUc67uYt9oAKMTnaCIID14mxDUBxTYMaiqvap/r8COjO85kAofAp8hIBc1Pfi/h7NRLX1u1AZk8Mmbi+ixRGeVCywwHmmQ==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=amd.com header.i="@amd.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Cc: <ray.huang@xxxxxxx>, Penny Zheng <Penny.Zheng@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, "Volodymyr Babchuk" <Volodymyr_Babchuk@xxxxxxxx>, Penny Zheng <penny.zheng@xxxxxxx>
  • Delivery-date: Fri, 27 Mar 2026 07:56:05 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

As preparation for fixing mfn_to_gfn() on ARM, we extend the existing GFN
field in page_info's type_info to be usable for not only xenheap ones.
Another usage will be introduced later for stolen pages in memory exchaging.

Introduce general-purpose page_get_gfn() and page_set_gfn() helpers
that read and write the GFN stored in type_info. The old
page_get_xenheap_gfn() and page_set_xenheap_gfn() are retained as thin
wrappers with their xenheap ASSERTs, so all current callers remain unchanged.

Also introduce PGT_INVALID_GFN as the general sentinel, with
PGT_INVALID_XENHEAP_GFN aliased to it for backward compatibility.

Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
---
 xen/arch/arm/include/asm/mm.h | 37 +++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/xen/arch/arm/include/asm/mm.h b/xen/arch/arm/include/asm/mm.h
index 72a6928624..d1873ec212 100644
--- a/xen/arch/arm/include/asm/mm.h
+++ b/xen/arch/arm/include/asm/mm.h
@@ -113,18 +113,21 @@ struct page_info
 #define PGT_count_mask    PG_mask(3, 3)
 
 /*
- * Stored in bits [28:0] (arm32) or [60:0] (arm64) GFN if page is xenheap page.
+ * Stored in bits [28:0] (arm32) or [60:0] (arm64) GFN if page is xenheap page,
+ * or stolen ones in memory exchanging.
  */
 #define PGT_gfn_width     PG_shift(3)
 #define PGT_gfn_mask      ((1UL<<PGT_gfn_width)-1)
 
-#define PGT_INVALID_XENHEAP_GFN   _gfn(PGT_gfn_mask)
+#define PGT_INVALID_GFN           _gfn(PGT_gfn_mask)
+#define PGT_INVALID_XENHEAP_GFN   PGT_INVALID_GFN
 
 /*
  * An arch-specific initialization pattern is needed for the type_info field
- * as it's GFN portion can contain the valid GFN if page is xenheap page.
+ * as it's GFN portion can contain the valid GFN if page is xenheap page, or
+ * stolen in memory exchanging.
  */
-#define PGT_TYPE_INFO_INITIALIZER   gfn_x(PGT_INVALID_XENHEAP_GFN)
+#define PGT_TYPE_INFO_INITIALIZER   gfn_x(PGT_INVALID_GFN)
 
  /* Cleared when the owning guest 'frees' this page. */
 #define _PGC_allocated    PG_shift(1)
@@ -338,28 +341,38 @@ unsigned int arch_get_dma_bitsize(void);
  * that requirement (risk of deadlock, lock inversion, etc) it is important
  * to make sure that all non-protected updates to this field are atomic.
  */
-static inline gfn_t page_get_xenheap_gfn(const struct page_info *p)
+static inline gfn_t page_get_gfn(const struct page_info *p)
 {
     gfn_t gfn_ = _gfn(ACCESS_ONCE(p->u.inuse.type_info) & PGT_gfn_mask);
 
-    ASSERT(is_xen_heap_page(p));
-
-    return gfn_eq(gfn_, PGT_INVALID_XENHEAP_GFN) ? INVALID_GFN : gfn_;
+    return gfn_eq(gfn_, PGT_INVALID_GFN) ? INVALID_GFN : gfn_;
 }
 
-static inline void page_set_xenheap_gfn(struct page_info *p, gfn_t gfn)
+static inline void page_set_gfn(struct page_info *p, gfn_t gfn)
 {
-    gfn_t gfn_ = gfn_eq(gfn, INVALID_GFN) ? PGT_INVALID_XENHEAP_GFN : gfn;
+    gfn_t gfn_ = gfn_eq(gfn, INVALID_GFN) ? PGT_INVALID_GFN : gfn;
     unsigned long x, nx, y = p->u.inuse.type_info;
 
-    ASSERT(is_xen_heap_page(p));
-
     do {
         x = y;
         nx = (x & ~PGT_gfn_mask) | gfn_x(gfn_);
     } while ( (y = cmpxchg(&p->u.inuse.type_info, x, nx)) != x );
 }
 
+static inline gfn_t page_get_xenheap_gfn(const struct page_info *p)
+{
+    ASSERT(is_xen_heap_page(p));
+
+    return page_get_gfn(p);
+}
+
+static inline void page_set_xenheap_gfn(struct page_info *p, gfn_t gfn)
+{
+    ASSERT(is_xen_heap_page(p));
+
+    page_set_gfn(p, gfn);
+}
+
 #endif /*  __ARCH_ARM_MM__ */
 /*
  * Local variables:
-- 
2.43.0




 


Rackspace

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