Re: [PATCH v6 17/25] iommu/arm-smmu-v3: Implement iommu_sva_bind/unbind()

Jean-Philippe Brucker
2020-05-05T09:15:45Z

On Mon, May 04, 2020 at 01:47:23PM -0700, Jacob Pan wrote:
> > > > + arm_smmu_write_ctx_desc(smmu_domain, mm->pasid,
> > > > &invalid_cd); +
> > > > + arm_smmu_tlb_inv_asid(smmu_domain->smmu,
> > > > smmu_mn->cd->asid);
> > > > + /* TODO: invalidate ATS */
> > > > +
> > > If mm release is called after tlb invalidate range, is it still
> > > necessary to invalidate again?
> >
> > No, provided all mappings from the address space are unmapped and
> > invalidated. I'll double check, but in my tests invalidate range
> > didn't seem to be called for all mappings on mm exit, so I believe we
> > do need this.
> >
> I think it is safe to invalidate again. There was a concern that mm
> release may delete IOMMU driver from the notification list and miss tlb
> invalidate range. I had a hard time to confirm that with ftrace while
> killing a process, many lost events.
>

If it helps, I have a test that generates small DMA transactions on a SMMU
model. This is the trace for a job on a 8kB mmap'd buffer:

smmu_bind_alloc: dev=0000:00:03.0 pasid=1
dev_fault: IOMMU:0000:00:03.0 type=2 reason=0 addr=0x0000ffff860e6000 pasid=1 group=74 flags=3 prot=2
dev_page_response: IOMMU:0000:00:03.0 code=0 pasid=1 group=74
dev_fault: IOMMU:0000:00:03.0 type=2 reason=0 addr=0x0000ffff860e7000 pasid=1 group=143 flags=3 prot=2
dev_page_response: IOMMU:0000:00:03.0 code=0 pasid=1 group=143
smmu_mm_invalidate: pasid=1 start=0xffff860e6000 end=0xffff860e8000
smmu_mm_invalidate: pasid=1 start=0xffff860e6000 end=0xffff860e8000
smmu_mm_invalidate: pasid=1 start=0xffff860e8000 end=0xffff860ea000
smmu_mm_invalidate: pasid=1 start=0xffff860e8000 end=0xffff860ea000
smmu_unbind_free: dev=0000:00:03.0 pasid=1

And this is the same job, but the process immediately kills itself after
launching it.

smmu_bind_alloc: dev=0000:00:03.0 pasid=1
dev_fault: IOMMU:0000:00:03.0 type=2 reason=0 addr=0x0000ffffb9d15000 pasid=1 group=259 flags=3 prot=2
smmu_mm_release: pasid=1
dev_page_response: IOMMU:0000:00:03.0 code=0 pasid=1 group=259
dev_fault: IOMMU:0000:00:03.0 type=2 reason=0 addr=0x0000ffffb9d15000 pasid=1 group=383 flags=3 prot=2
dev_page_response: IOMMU:0000:00:03.0 code=1 pasid=1 group=383
smmu_unbind_free: dev=0000:00:03.0 pasid=1

We don't get any invalidate_range notification in this case.

Thanks,
Jean