|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 17/24] xen/passthrough: arm: release earlier the DT devices assigned to a guest
On Tue, 13 Jan 2015, Julien Grall wrote:
> The toolstack may not have deassign every device used by a guest.
> Therefore we have to go through the device list and removing them before
> asking the IOMMU drivers to release memory for this domain.
>
> This can be done by moving the call to the release function when we
> relinquish the resources. The IOMMU part will be destroyed later when
> the domain is freed.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
>
> Changes in v3:
> - Patch added. Superseed the patch "xen/passthrough: call
> arch_iommu_domain_destroy before calling iommu teardown" in
> the previous patch series.
Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> xen/arch/arm/domain.c | 4 ++++
> xen/drivers/passthrough/arm/iommu.c | 1 -
> xen/drivers/passthrough/device_tree.c | 5 ++++-
> xen/include/xen/iommu.h | 2 +-
> 4 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
> index 6e56665..d85748a 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -772,6 +772,10 @@ int domain_relinquish_resources(struct domain *d)
> switch ( d->arch.relmem )
> {
> case RELMEM_not_started:
> + ret = iommu_release_dt_devices(d);
> + if ( ret )
> + return ret;
> +
> d->arch.relmem = RELMEM_xen;
> /* Falltrough */
>
> diff --git a/xen/drivers/passthrough/arm/iommu.c
> b/xen/drivers/passthrough/arm/iommu.c
> index 5870aef..8223a39 100644
> --- a/xen/drivers/passthrough/arm/iommu.c
> +++ b/xen/drivers/passthrough/arm/iommu.c
> @@ -66,7 +66,6 @@ int arch_iommu_domain_init(struct domain *d)
>
> void arch_iommu_domain_destroy(struct domain *d)
> {
> - iommu_dt_domain_destroy(d);
> }
>
> int arch_iommu_populate_page_table(struct domain *d)
> diff --git a/xen/drivers/passthrough/device_tree.c
> b/xen/drivers/passthrough/device_tree.c
> index 88e496e..e7eb34f 100644
> --- a/xen/drivers/passthrough/device_tree.c
> +++ b/xen/drivers/passthrough/device_tree.c
> @@ -97,7 +97,7 @@ int iommu_dt_domain_init(struct domain *d)
> return 0;
> }
>
> -void iommu_dt_domain_destroy(struct domain *d)
> +int iommu_release_dt_devices(struct domain *d)
> {
> struct hvm_iommu *hd = domain_hvm_iommu(d);
> struct dt_device_node *dev, *_dev;
> @@ -109,5 +109,8 @@ void iommu_dt_domain_destroy(struct domain *d)
> if ( rc )
> dprintk(XENLOG_ERR, "Failed to deassign %s in domain %u\n",
> dt_node_full_name(dev), d->domain_id);
> + return rc;
> }
> +
> + return 0;
> }
> diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
> index c146ee4..d03df14 100644
> --- a/xen/include/xen/iommu.h
> +++ b/xen/include/xen/iommu.h
> @@ -117,7 +117,7 @@ void iommu_read_msi_from_ire(struct msi_desc *msi_desc,
> struct msi_msg *msg);
> int iommu_assign_dt_device(struct domain *d, struct dt_device_node *dev);
> int iommu_deassign_dt_device(struct domain *d, struct dt_device_node *dev);
> int iommu_dt_domain_init(struct domain *d);
> -void iommu_dt_domain_destroy(struct domain *d);
> +int iommu_release_dt_devices(struct domain *d);
>
> #endif /* HAS_DEVICE_TREE */
>
> --
> 2.1.4
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |