• Will Deacon's avatar
    iommu/arm-smmu: Reintroduce locking around TLB sync operations · 8e517e76
    Will Deacon authored
    Commit 523d7423 ("iommu/arm-smmu: Remove io-pgtable spinlock")
    removed the locking used to serialise map/unmap calls into the io-pgtable
    code from the ARM SMMU driver. This is good for performance, but opens
    us up to a nasty race with TLB syncs because the TLB sync register is
    shared within a context bank (or even globally for stage-2 on SMMUv1).
    
    There are two cases to consider:
    
      1. A CPU can be spinning on the completion of a TLB sync, take an
         interrupt which issues a subsequent TLB sync, and then report a
         timeout on return from the interrupt.
    
      2. A CPU can be spinning on the completion of a TLB sync, but other
         CPUs can continuously issue additional TLB syncs in such a way that
         the backoff logic reports a timeout.
    
    Rather than fix this by spinning for completion of prior TLB syncs before
    issuing a new one (which may suffer from fairness issues on large systems),
    instead reintroduce locking around TLB sync operations in the ARM SMMU
    driver.
    
    Fixes: 523d7423 ("iommu/arm-smmu: Remove io-pgtable spinlock")
    Cc: Robin Murphy <robin.murphy@arm.com>
    Reported-by: default avatarRay Jui <ray.jui@broadcom.com>
    Tested-by: default avatarRay Jui <ray.jui@broadcom.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    8e517e76
arm-smmu.c 64 KB