• James Hogan's avatar
    MIPS: c-r4k: Fix valid ASID optimisation · 6d758bfc
    James Hogan authored
    Several cache operations are optimised to return early from the SMP call
    handler if the memory map in question has no valid ASID on the current
    CPU, or any online CPU in the case of MIPS_MT_SMP. The idea is that if a
    memory map has never been used on a CPU it shouldn't have cache lines in
    need of flushing.
    
    However this doesn't cover all cases when ASIDs for other CPUs need to
    be checked:
    - Offline VPEs may have recently been online and brought lines into the
      (shared) cache, so they should also be checked, rather than only
      online CPUs.
    - SMP systems with a Coherence Manager (CM), but with MT disabled still
      have globalized hit cache ops, but don't use SMP calls, so all present
      CPUs should be taken into account.
    - R6 systems have a different multithreading implementation, so
      MIPS_MT_SMP won't be set, but as above may still have a CM which
      globalizes hit cache ops.
    
    Additionally for non-globalized cache operations where an SMP call to a
    single VPE in each foreign core is used, it is not necessary to check
    every CPU in the system, only sibling CPUs sharing the same first level
    cache.
    
    Fix this by making has_valid_asid() take a cache op type argument like
    r4k_on_each_cpu(), so it can determine whether r4k_on_each_cpu() will
    have done SMP calls to other cores. It can then determine which set of
    CPUs to check the ASIDs of based on that, excluding foreign CPUs if an
    SMP call will have been performed.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: Paul Burton <paul.burton@imgtec.com>
    Cc: Leonid Yegoshin <leonid.yegoshin@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/13804/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    6d758bfc
c-r4k.c 50.8 KB