Add a returnable CCA hook to domain_relinquish_resources(). Later patches plug the RMI teardown work into this path.
Signed-off-by: Koichiro Den <[email protected]> --- 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
