• Alistair Popple's avatar
    mmu_notifiers: call invalidate_range() when invalidating TLBs · 6bbd42e2
    Alistair Popple authored
    The invalidate_range() is going to become an architecture specific mmu
    notifier used to keep the TLB of secondary MMUs such as an IOMMU in sync
    with the CPU page tables.  Currently it is called from separate code paths
    to the main CPU TLB invalidations.  This can lead to a secondary TLB not
    getting invalidated when required and makes it hard to reason about when
    exactly the secondary TLB is invalidated.
    
    To fix this move the notifier call to the architecture specific TLB
    maintenance functions for architectures that have secondary MMUs requiring
    explicit software invalidations.
    
    This fixes a SMMU bug on ARM64.  On ARM64 PTE permission upgrades require
    a TLB invalidation.  This invalidation is done by the architecture
    specific ptep_set_access_flags() which calls flush_tlb_page() if required.
    However this doesn't call the notifier resulting in infinite faults being
    generated by devices using the SMMU if it has previously cached a
    read-only PTE in it's TLB.
    
    Moving the invalidations into the TLB invalidation functions ensures all
    invalidations happen at the same time as the CPU invalidation.  The
    architecture specific flush_tlb_all() routines do not call the notifier as
    none of the IOMMUs require this.
    
    Link: https://lkml.kernel.org/r/0287ae32d91393a582897d6c4db6f7456b1001f2.1690292440.git-series.apopple@nvidia.comSigned-off-by: default avatarAlistair Popple <apopple@nvidia.com>
    Suggested-by: default avatarJason Gunthorpe <jgg@ziepe.ca>
    Tested-by: default avatarSeongJae Park <sj@kernel.org>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Tested-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
    Cc: Andrew Donnellan <ajd@linux.ibm.com>
    Cc: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>
    Cc: Frederic Barrat <fbarrat@linux.ibm.com>
    Cc: John Hubbard <jhubbard@nvidia.com>
    Cc: Kevin Tian <kevin.tian@intel.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Nicolin Chen <nicolinc@nvidia.com>
    Cc: Robin Murphy <robin.murphy@arm.com>
    Cc: Sean Christopherson <seanjc@google.com>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Zhi Wang <zhi.wang.linux@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    6bbd42e2
tlbflush.h 6.2 KB