Re: [PATCH v10 12/13] iommu/arm-smmu-v3: Implement iommu_sva_bind/unbind()

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

 



On Tue, Nov 24, 2020 at 07:58:00PM -0400, Jason Gunthorpe wrote:
> On Fri, Sep 18, 2020 at 12:18:52PM +0200, Jean-Philippe Brucker wrote:
> 
> > +/* Allocate or get existing MMU notifier for this {domain, mm} pair */
> > +static struct arm_smmu_mmu_notifier *
> > +arm_smmu_mmu_notifier_get(struct arm_smmu_domain *smmu_domain,
> > +			  struct mm_struct *mm)
> > +{
> > +	int ret;
> > +	struct arm_smmu_ctx_desc *cd;
> > +	struct arm_smmu_mmu_notifier *smmu_mn;
> > +
> > +	list_for_each_entry(smmu_mn, &smmu_domain->mmu_notifiers, list) {
> > +		if (smmu_mn->mn.mm == mm) {
> > +			refcount_inc(&smmu_mn->refs);
> > +			return smmu_mn;
> > +		}
> > +	}
> > +
> > +	cd = arm_smmu_alloc_shared_cd(mm);
> > +	if (IS_ERR(cd))
> > +		return ERR_CAST(cd);
> > +
> > +	smmu_mn = kzalloc(sizeof(*smmu_mn), GFP_KERNEL);
> > +	if (!smmu_mn) {
> > +		ret = -ENOMEM;
> > +		goto err_free_cd;
> > +	}
> > +
> > +	refcount_set(&smmu_mn->refs, 1);
> > +	smmu_mn->cd = cd;
> > +	smmu_mn->domain = smmu_domain;
> > +	smmu_mn->mn.ops = &arm_smmu_mmu_notifier_ops;
> > +
> > +	ret = mmu_notifier_register(&smmu_mn->mn, mm);
> > +	if (ret) {
> > +		kfree(smmu_mn);
> > +		goto err_free_cd;
> > +	}
> 
> I suppose this hasn't been applied yet, but someone asked me to look
> at this series..

It's queued for v5.11, but I could submit improvements for 5.12

> Why did you drop the change to mmu_notifier_get here?

Dropped at v6 when I got rid of the io_mm cruft:
https://lore.kernel.org/linux-iommu/20200430143424.2787566-1-jean-philippe@xxxxxxxxxx/

> I'm strongly
> trying to discourage static lists matching mm's like smmu_mn is
> doing. This is handled by the core code, don't open code it..

We discussed this at v6, which wonkily stored the mn ops in the domain to
obtain a unique notifier per {mm, domain}. A clean solution requires
changing mm_notifier_get() to use an opaque token. Rather than testing
{mm, ops} uniqueness it would compare {mm, ops, token}. I figured it
wasn't worth the effort for a single driver, especially since the SMMU
driver would still have one list matching because it needs to deal with
both {mm, domain} and {mm, device} uniqueness.
https://lore.kernel.org/linux-iommu/20200501121552.GA6012@xxxxxxxxxxxxx/

Thanks,
Jean





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux