[PATCH v5 12/27] iommu/arm-smmu-v3: Start building a generic PASID layer
Jason Gunthorpe
jgg at nvidia.com
Wed Mar 20 11:32:04 PDT 2024
On Wed, Mar 20, 2024 at 12:11:36AM +0800, Michael Shavit wrote:
> > @@ -448,19 +446,10 @@ static int __arm_smmu_sva_bind(struct device *dev, ioasid_t pasid,
> > goto err_free_bond;
> > }
> >
> > - cdptr = arm_smmu_get_cd_ptr(master, mm_get_enqcmd_pasid(mm));
> > - if (!cdptr) {
> > - ret = -ENOMEM;
> > - goto err_put_notifier;
> > - }
> > - arm_smmu_make_sva_cd(&target, master, mm, bond->smmu_mn->cd->asid);
> > - arm_smmu_write_cd_entry(master, pasid, cdptr, &target);
> > -
> > + arm_smmu_make_sva_cd(target, master, mm, bond->smmu_mn->cd->asid);
> This can probably already move out to arm_smmu_sva_set_dev_pasid in
> this commit. Removing the arm_smmu_get_cd_ptr pre-alloc might also be
> possible if we're careful with failure of arm_smmu_set_pasid.
> This is eventually addressed in "iommu/arm-smmu-v3: Put the SVA mmu
> notifier in the smmu_domain", but that patch is already big enough as
> it is and the change fits nicely here.
Since all this bond related code is going to be deleted I didn't want
to mess with it too much, but sure it looks like this:
static int arm_smmu_sva_set_dev_pasid(struct iommu_domain *domain,
struct device *dev, ioasid_t id)
{
struct arm_smmu_master *master = dev_iommu_priv_get(dev);
struct mm_struct *mm = domain->mm;
struct arm_smmu_bond *bond;
struct arm_smmu_cd target;
int ret;
if (mm_get_enqcmd_pasid(mm) != id)
return -EINVAL;
mutex_lock(&sva_lock);
bond = __arm_smmu_sva_bind(dev, mm);
if (IS_ERR(bond)) {
mutex_unlock(&sva_lock);
return PTR_ERR(bond);
}
arm_smmu_make_sva_cd(&target, master, mm, bond->smmu_mn->cd->asid);
ret = arm_smmu_set_pasid(master, to_smmu_domain(domain), id, &target);
if (ret) {
list_del(&bond->list);
arm_smmu_mmu_notifier_put(bond->smmu_mn);
kfree(bond);
mutex_unlock(&sva_lock);
return ret;
}
mutex_unlock(&sva_lock);
return 0;
}
Which is much closer to the final arrangment in later patches.
Jason
More information about the linux-arm-kernel
mailing list