• Mathieu Desnoyers's avatar
    sched: Add missing memory barrier in switch_mm_cid · fe90f396
    Mathieu Desnoyers authored
    Many architectures' switch_mm() (e.g. arm64) do not have an smp_mb()
    which the core scheduler code has depended upon since commit:
    
        commit 223baf9d ("sched: Fix performance regression introduced by mm_cid")
    
    If switch_mm() doesn't call smp_mb(), sched_mm_cid_remote_clear() can
    unset the actively used cid when it fails to observe active task after it
    sets lazy_put.
    
    There *is* a memory barrier between storing to rq->curr and _return to
    userspace_ (as required by membarrier), but the rseq mm_cid has stricter
    requirements: the barrier needs to be issued between store to rq->curr
    and switch_mm_cid(), which happens earlier than:
    
      - spin_unlock(),
      - switch_to().
    
    So it's fine when the architecture switch_mm() happens to have that
    barrier already, but less so when the architecture only provides the
    full barrier in switch_to() or spin_unlock().
    
    It is a bug in the rseq switch_mm_cid() implementation. All architectures
    that don't have memory barriers in switch_mm(), but rather have the full
    barrier either in finish_lock_switch() or switch_to() have them too late
    for the needs of switch_mm_cid().
    
    Introduce a new smp_mb__after_switch_mm(), defined as smp_mb() in the
    generic barrier.h header, and use it in switch_mm_cid() for scheduler
    transitions where switch_mm() is expected to provide a memory barrier.
    
    Architectures can override smp_mb__after_switch_mm() if their
    switch_mm() implementation provides an implicit memory barrier.
    Override it with a no-op on x86 which implicitly provide this memory
    barrier by writing to CR3.
    
    Fixes: 223baf9d ("sched: Fix performance regression introduced by mm_cid")
    Reported-by: default avatarlevi.yun <yeoreum.yun@arm.com>
    Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> # for arm64
    Acked-by: Dave Hansen <dave.hansen@linux.intel.com> # for x86
    Cc: <stable@vger.kernel.org> # 6.4.x
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: https://lore.kernel.org/r/20240415152114.59122-2-mathieu.desnoyers@efficios.com
    fe90f396
barrier.h 2.45 KB