[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, 2015-01-13 at 14:25 +0000, Julien Grall wrote:

Subject: "release the DT devices assigned to a guest earlier"

> The toolstack may not have deassign every device used by a guest.

"deassigned"

> Therefore we have to go through the device list and removing them before

"and remove them"

> 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>

Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

I'd like to hear Jan's opinion though.

> 
> ---
>     Changes in v3:
>         - Patch added. Superseed the patch "xen/passthrough: call
>         arch_iommu_domain_destroy before calling iommu teardown" in
>         the previous patch series.
> ---
>  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 */
>  



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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