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