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

[xen staging] xen/arm: smmuv1: Revert associating the group pointer with the S2CR



commit 9f6cd4983715cb31f0ea540e6bbb63f799a35d8a
Author:     Rahul Singh <rahul.singh@xxxxxxx>
AuthorDate: Fri Apr 16 12:25:02 2021 +0100
Commit:     Julien Grall <jgrall@xxxxxxxxxx>
CommitDate: Tue Apr 20 13:22:54 2021 +0100

    xen/arm: smmuv1: Revert associating the group pointer with the S2CR
    
    Revert the code that associates the group pointer with the S2CR as this
    code causing an issue when the SMMU device has more than one master
    device with same stream-id. This issue is introduced by commit
    0435784cc75d ("xen/arm: smmuv1: Intelligent SMR allocationâ??
    
    Reverting the code will not impact to use of SMMU if two devices use the
    same stream-id but each device will be in a separate group. This is the same
    behaviour before the code is merged.
    
    Fixes: 0435784cc75d ("xen/arm: smmuv1: Intelligent SMR allocationâ??
    Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx>
---
 xen/drivers/passthrough/arm/smmu.c | 44 ++++----------------------------------
 1 file changed, 4 insertions(+), 40 deletions(-)

diff --git a/xen/drivers/passthrough/arm/smmu.c 
b/xen/drivers/passthrough/arm/smmu.c
index 24ac4f3a80..1a68c2ab3b 100644
--- a/xen/drivers/passthrough/arm/smmu.c
+++ b/xen/drivers/passthrough/arm/smmu.c
@@ -597,7 +597,6 @@ enum arm_smmu_arch_version {
 };
 
 struct arm_smmu_s2cr {
-       struct iommu_group              *group;
        int                             count;
        enum arm_smmu_s2cr_type         type;
        enum arm_smmu_s2cr_privcfg      privcfg;
@@ -1498,7 +1497,6 @@ static int arm_smmu_master_alloc_smes(struct device *dev)
        struct arm_smmu_master_cfg *cfg = find_smmu_master_cfg(dev);
        struct arm_smmu_device *smmu = cfg->smmu;
        struct arm_smmu_smr *smrs = smmu->smrs;
-       struct iommu_group *group;
        int i, idx, ret;
 
        spin_lock(&smmu->stream_map_lock);
@@ -1523,19 +1521,9 @@ static int arm_smmu_master_alloc_smes(struct device *dev)
                cfg->smendx[i] = (s16)idx;
        }
 
-       group = iommu_group_get(dev);
-       if (!group)
-               group = ERR_PTR(-ENOMEM);
-       if (IS_ERR(group)) {
-               ret = PTR_ERR(group);
-               goto out_err;
-       }
-       iommu_group_put(group);
-
        /* It worked! Now, poke the actual hardware */
        for_each_cfg_sme(cfg, i, idx) {
                arm_smmu_write_sme(smmu, idx);
-               smmu->s2crs[idx].group = group;
        }
 
        spin_unlock(&smmu->stream_map_lock);
@@ -1966,27 +1954,6 @@ static void __arm_smmu_release_pci_iommudata(void *data)
        kfree(data);
 }
 
-static struct iommu_group *arm_smmu_device_group(struct
-                                               arm_smmu_master_cfg *cfg)
-{
-       struct arm_smmu_device *smmu = cfg->smmu;
-       struct iommu_group *group = NULL;
-       int i, idx;
-
-       for_each_cfg_sme(cfg, i, idx) {
-               if (group && smmu->s2crs[idx].group &&
-                   group != smmu->s2crs[idx].group)
-                       return ERR_PTR(-EINVAL);
-
-               group = smmu->s2crs[idx].group;
-       }
-
-       if (group)
-               return group;
-
-       return NULL;
-}
-
 static int arm_smmu_add_device(struct device *dev)
 {
        struct arm_smmu_device *smmu;
@@ -2027,13 +1994,10 @@ static int arm_smmu_add_device(struct device *dev)
                cfg->smmu = smmu;
        }
 
-       group = arm_smmu_device_group(cfg);
-       if (!group) {
-               group = iommu_group_alloc();
-               if (IS_ERR(group)) {
-                       dev_err(dev, "Failed to allocate IOMMU group\n");
-                       return PTR_ERR(group);
-               }
+       group = iommu_group_alloc();
+       if (IS_ERR(group)) {
+               dev_err(dev, "Failed to allocate IOMMU group\n");
+               return PTR_ERR(group);
        }
 
        iommu_group_set_iommudata(group, cfg, releasefn);
--
generated by git-patchbot for /home/xen/git/xen.git#staging



 


Rackspace

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