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

Re: [Xen-devel] [PATCH v4 7/8] xen/iommu: smmu: Advertise when the SMMU support coherent table walk



On Wed, 2015-02-25 at 18:53 +0000, Julien Grall wrote:
> When SMMU doesn't support coherent table walk, Xen may need to clean
> updated PT (see commit 4c5f4cb "xen/arm: p2m: Clean cache PT when the
> IOMMU doesn't support coherent walk").
> 
> If one SMMU of the platform doesn't support coherent table walk, the
> feature is disabled for the whole platform. This is because device is
> assigned to a domain after the page table are populated.
> 
> This could impact performance on domain which doesn't use device
> passthrough. But, as the spec strongly recommends the support of this
> feature for maintstream platform, I expect server will always have SMMUs

"mainstream".

> supporting coherent table walk. If not, we may need to enable this feature
> per-domain.
> 
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
> 
> ---
>     I've just noticed that the support on the previous driver (i.e in
>     Xen 4.5) may incorrectly expose this feature when all the SMMUs is
>     not supporting coherent table walk.
> 
>     I'm not sure, if I should send a patch for it.
> 
>     Also I didn't squash this patch into "xen/iommu: smmu: Add Xen specific
>     code to be able to use the driver" to help for review and to catch
>     possible error in this patch.
> 
>     Changes in v4:
>         - Browse the list to retrieve the last SMMU added.
>         - Take the spinlock
> 
>     Changes in v3:
>         - Patch added
> ---
>  xen/drivers/passthrough/arm/smmu.c | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 
> diff --git a/xen/drivers/passthrough/arm/smmu.c 
> b/xen/drivers/passthrough/arm/smmu.c
> index d01a26a..b478463 100644
> --- a/xen/drivers/passthrough/arm/smmu.c
> +++ b/xen/drivers/passthrough/arm/smmu.c
> @@ -2531,6 +2531,13 @@ MODULE_LICENSE("GPL v2");
>  /* Xen only supports stage-2 translation, so force the value to 2. */
>  static int force_stage = 2;
>  
> +/*
> + * Platform features. It indicates the list of features supported by all the
> + * SMMUs.

s/the//

> + * Actually we only care about coherent table walk.
> + */
> +static u32 platform_features = ARM_SMMU_FEAT_COHERENT_WALK;
> +
>  static void arm_smmu_iotlb_flush_all(struct domain *d)
>  {
>       struct arm_smmu_xen_domain *smmu_domain = 
> domain_hvm_iommu(d)->arch.priv;
> @@ -2668,6 +2675,13 @@ static int arm_smmu_iommu_domain_init(struct domain *d)
>  
>       domain_hvm_iommu(d)->arch.priv = xen_domain;
>  
> +     /*
> +      * The feature coherent walk can be enabled only when all SMMUs
> +      * support it.

s/The feature c/C/

or "The coherent walk feature..." (I prefer the former since it is
briefer)

> +      */
> +     if (platform_features & ARM_SMMU_FEAT_COHERENT_WALK)
> +             iommu_set_feature(d, IOMMU_FEAT_COHERENT_WALK);
> +
>       return 0;
>  }
>  
> @@ -2742,6 +2756,7 @@ static __init int arm_smmu_dt_init(struct 
> dt_device_node *dev,
>                                  const void *data)
>  {
>       int rc;
> +     struct arm_smmu_device *smmu;
>  
>       /*
>        * Even if the device can't be initialized, we don't want to
> @@ -2755,6 +2770,20 @@ static __init int arm_smmu_dt_init(struct 
> dt_device_node *dev,
>  
>       iommu_set_ops(&arm_smmu_iommu_ops);
>  
> +     /* Find the last SMMU added and retrieve its features. */

This comment no longer applies, I think?

> +     spin_lock(&arm_smmu_devices_lock);
> +     list_for_each_entry(smmu, &arm_smmu_devices, list) {
> +             if (smmu->dev == &dev->dev)
> +                     goto found;

Please try and avoid goto. In this case I think 
     {
         platform_features &= smmu->features;
         break;
     }

within the if would be fine, combined with dropping the following BUG().

Alternatively you might prefer to provide a helper function to lookup an
smmu by &dev->dev.


> +     }
> +
> +     BUG();
> +
> +found:
> +     platform_features &= smmu->features;
> +
> +     spin_unlock(&arm_smmu_devices_lock);
> +
>       return 0;
>  }
>  



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