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

[RFC PATCH v1 10/26] xen/arm/cca: add Realm relinquish entry point


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Koichiro Den <den@xxxxxxxxxxxxx>
  • Date: Fri, 15 May 2026 13:07:56 +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=iQozeGS6NXue2xy04GwS38eB6n43tpIm85e71KD3+fs=; b=BQw0NCinlv8YvV9NUnVME52qwAL+Us66Bxia60rM2OBPfamYqcTbuczz9XiljOSkAj1Ivq8LFBRNBnZb18b/uBY10JUTpy/NokPp3GAQkCU75ES9bC7f/4fjR0VKiEfZhHoq2Cd6FDF3Ux+DbjHP/lYlKlKjY2qSElN25ctr+rvTKQHfis75QoMZQRFAS/Pfm6JVPVWuhj/NK9g/tPvjj4B7Vx1i2UHGMdOgE+XgCWJbSWwMZf7163f0dQQj02wsuU/N77WUYcYxBHHVjo29Iz2jX1TEno1x6D3D6Zmh7uv1Dg3WcjHQPoSURzx3kZiM4jUzUI0Ut8RXKGu6iwQsew==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Xs0ySpsXho/Q/PJkUY8kHQOPF8BiMJOyVyG1On69+0sLGBFGdWPDQDlaF5wp2mr3rulYxR9wP0SfbQRvHLhMcZlyjXF78a4zoXU6WlPKYyBoq9FTuE0irpt36iprv6ZNe26nsfmNzmq/UcU0kZMyayvnixvCmmzpX/GMs9XGLDR90CYd9ac5t++2Gd5e5DLQCO6F6o1jfslEaVOEFYOXCQmH/2cgNZQJ+Xa8VZ3bJ7m0Xpa7M7fHUQW5iQQmClwS7eOvigCW3vAOtgyb9bH/Katua+bo35oJqnG7xXjhqadUHX7UJ4jLsRgkO5FJkqe/iCZY5Zxx128GnX8GLaUTbg==
  • 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 Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Julien Grall <julien@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, "Daniel P. Smith" <dpsmith@xxxxxxxxxxxxxxxxxxxx>, Juergen Gross <jgross@xxxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Fri, 15 May 2026 04:11:36 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Add a returnable CCA hook to domain_relinquish_resources(). Later
patches plug the RMI teardown work into this path.

Signed-off-by: Koichiro Den <den@xxxxxxxxxxxxx>
---
 xen/arch/arm/cca/state.c       | 24 ++++++++++++++++++++++++
 xen/arch/arm/domain.c          |  8 ++++++++
 xen/arch/arm/include/asm/cca.h |  5 +++++
 3 files changed, 37 insertions(+)

diff --git a/xen/arch/arm/cca/state.c b/xen/arch/arm/cca/state.c
index 66375965a1b4..3646948eb11c 100644
--- a/xen/arch/arm/cca/state.c
+++ b/xen/arch/arm/cca/state.c
@@ -19,6 +19,7 @@ static void arm_cca_reset_domain_state(struct domain *d)
     d->arch.cca.rd_page = NULL;
     d->arch.cca.rtt_root_page = NULL;
     d->arch.cca.nr_realm_sro_pages = 0;
+    INIT_PAGE_LIST_HEAD(&d->arch.cca.abandoned_pages);
     d->arch.cca.rtts = NULL;
     d->arch.cca.nr_rtts = 0;
     d->arch.cca.data_pages = NULL;
@@ -52,6 +53,29 @@ void arm_cca_domain_destroy(struct domain *d)
     arm_cca_reset_domain_state(d);
 }
 
+static int arm_cca_relinquish_abandoned_pages(struct domain *d)
+{
+    struct page_info *pg, *tmp;
+    int rc;
+
+    page_list_for_each_safe( pg, tmp, &d->arch.cca.abandoned_pages )
+    {
+        rc = arm_cca_undelegate_granule(page_to_maddr(pg));
+        if ( rc != 0 )
+            return rc;
+
+        page_list_del(pg, &d->arch.cca.abandoned_pages);
+        free_domheap_page(pg);
+    }
+
+    return 0;
+}
+
+int arm_cca_domain_relinquish_resources(struct domain *d)
+{
+    return arm_cca_relinquish_abandoned_pages(d);
+}
+
 void arm_cca_vcpu_init(struct vcpu *v)
 {
     arm_cca_reset_vcpu_state(v);
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 4b6115491c59..2d9469f388c6 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -1038,6 +1038,7 @@ enum {
     PROG_sci,
     PROG_tee,
     PROG_xen,
+    PROG_cca,
     PROG_page,
     PROG_mapping,
     PROG_p2m_root,
@@ -1098,6 +1099,13 @@ int domain_relinquish_resources(struct domain *d)
         if ( ret )
             return ret;
 
+    PROGRESS(cca):
+#ifdef CONFIG_ARM_CCA
+        ret = arm_cca_domain_relinquish_resources(d);
+        if ( ret )
+            return ret;
+#endif
+
     PROGRESS(page):
         ret = relinquish_memory(d, &d->page_list);
         if ( ret )
diff --git a/xen/arch/arm/include/asm/cca.h b/xen/arch/arm/include/asm/cca.h
index 80c161078d6c..9b53c80b5bba 100644
--- a/xen/arch/arm/include/asm/cca.h
+++ b/xen/arch/arm/include/asm/cca.h
@@ -3,6 +3,7 @@
 #define ARM_CCA_H
 
 #include <xen/init.h>
+#include <xen/mm.h>
 #include <xen/types.h>
 
 /*
@@ -57,6 +58,9 @@ struct arm_cca_domain_state {
     struct page_info *realm_sro_pages[ARM_CCA_MAX_SRO_DONATION_PAGES];
     unsigned int nr_realm_sro_pages;
 
+    /* Delegated pages which still need host-side undelegation retry. */
+    struct page_list_head abandoned_pages;
+
     struct arm_cca_rtt_record *rtts;
     unsigned int nr_rtts;
 
@@ -76,6 +80,7 @@ struct arm_cca_vcpu_state {
 
 void arm_cca_domain_init(struct domain *d);
 void arm_cca_domain_destroy(struct domain *d);
+int arm_cca_domain_relinquish_resources(struct domain *d);
 
 void arm_cca_vcpu_init(struct vcpu *v);
 void arm_cca_vcpu_destroy(struct vcpu *v);
-- 
2.51.0




 


Rackspace

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