|
[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
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |