|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 13/13] xen/iommu: smmu: Advertise when the SMMU support coherent table walk
On Fri, 30 Jan 2015, 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
> 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 v3:
> - Patch added
> ---
> xen/drivers/passthrough/arm/smmu.c | 25 +++++++++++++++++++++++++
> 1 file changed, 25 insertions(+)
>
> diff --git a/xen/drivers/passthrough/arm/smmu.c
> b/xen/drivers/passthrough/arm/smmu.c
> index 373eee8..f4c7e49 100644
> --- a/xen/drivers/passthrough/arm/smmu.c
> +++ b/xen/drivers/passthrough/arm/smmu.c
> @@ -577,6 +577,13 @@ struct arm_smmu_domain {
> spinlock_t lock;
> };
>
> +/*
> + * Xen: Platform features. It indicates the list of features support by all
> the
> + * SMMUs.
> + * Actually we only care about coherent table walk.
> + */
> +static u32 platform_features = ARM_SMMU_FEAT_COHERENT_WALK;
> +
> /* Xen: Dummy iommu_domain */
> struct iommu_domain
> {
> @@ -2810,6 +2817,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.
> + */
> + if (platform_features & ARM_SMMU_FEAT_COHERENT_WALK)
> + iommu_set_feature(d, IOMMU_FEAT_COHERENT_WALK);
> +
> return 0;
> }
As long as you are sure that arm_smmu_iommu_domain_init is called after
all the iommus have been initialized by arm_smmu_dt_init, then this
patch is correct.
> @@ -2885,6 +2899,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
> @@ -2896,6 +2911,16 @@ static __init int arm_smmu_dt_init(struct
> dt_device_node *dev,
> if ( !rc )
> iommu_set_ops(&arm_smmu_iommu_ops);
>
> + /*
> + * The last added SMMU is the first element of arm_smmu_devices.
> + * It's not necessary to take the lock because only the boot CPU is
> + * initialized the SMMU devices.
> + */
> + smmu = list_entry(arm_smmu_devices.next, typeof(*smmu), list);
> + ASSERT(smmu != NULL);
> +
> + platform_features &= smmu->features;
> +
> return rc;
> }
>
> --
> 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 |