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

Re: [Xen-devel] [PATCH v3] xen/passthrough: Support a single iommu_domain per xen domain per SMMU



Hello Robert,

On 24/03/2015 16:42, Robbie VanVossen wrote:
If multiple devices are being passed through to the same domain and they
share a single SMMU, then they only require a single iommu_domain.

In arm_smmu_assign_dev, before a new iommu_domain is created, the
xen_domain->contexts is checked for any iommu_domains that are already
assigned to device that uses the same SMMU as the current device. If one
is found, attach the device to that iommu_domain. If a new one isn't
found, create a new iommu_domain just like before.

The arm_smmu_deassign_dev function assumes that there is a single
device per iommu_domain. This meant that when the first device was
deassigned, the iommu_domain was freed and when another device was
deassigned a crash occured in xen.

To fix this, a reference counter was added to the iommu_domain struct.
When an arm_smmu_xen_device references an iommu_domain, the
iommu_domains ref is incremented. When that reference is removed, the
iommu_domains ref is decremented. The iommu_domain will only be freed
when the ref is 0.

Signed-off-by: Robbie VanVossen <robert.vanvossen@xxxxxxxxxxxxxxx>

---
Changed since v2:
   * Fixed coding style
   * Removed an unnecessary error message
   * Added some helper functions to clean up the workflow in 
arm_smmu_assign_dev a bit
Changed since v1:
   * Fixed coding style for comments
   * Move increment/decrement outside of attach/detach functions
   * Expanded xen_domain->lock to protect more of the assign/deassign
     functions
   * Removed iommu_domain add/remove_device functions
---
  xen/drivers/passthrough/arm/smmu.c |   99 ++++++++++++++++++++++++++----------
  1 file changed, 71 insertions(+), 28 deletions(-)

diff --git a/xen/drivers/passthrough/arm/smmu.c 
b/xen/drivers/passthrough/arm/smmu.c
index a7a7da9..be0ecdc 100644
--- a/xen/drivers/passthrough/arm/smmu.c
+++ b/xen/drivers/passthrough/arm/smmu.c
@@ -223,6 +223,7 @@ struct iommu_domain
        /* Runtime SMMU configuration for this iommu_domain */
        struct arm_smmu_domain          *priv;

+       atomic_t ref;
        /* Used to link iommu_domain contexts for a same domain.
         * There is at least one per-SMMU to used by the domain.
         * */
@@ -2564,12 +2565,45 @@ static void arm_smmu_iotlb_flush(struct domain *d, 
unsigned long gfn,
      arm_smmu_iotlb_flush_all(d);
  }

+static struct iommu_domain *arm_smmu_get_domain(struct domain *d,
+                                                               struct device 
*dev)

The indentation is wrong here.

[..]

-       spin_lock(&xen_domain->lock);
-       /* Chain the new context to the domain */
-       list_add(&domain->list, &xen_domain->contexts);
-       spin_unlock(&xen_domain->lock);
+               /* Chain the new context to the domain */
+               list_add(&domain->list, &xen_domain->contexts);
+               

This line contains trailing white-space.

Other than this 2 nits:

Reviewed-by: Julien Grall <julien.grall@xxxxxxxxxx>

Regards,

--
Julien Grall

_______________________________________________
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®.