[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 5.15 176/846] powerpc: Avoid discarding flags in system_call_exception()
    From: Mark Rutland <>

    [ Upstream commit 08b0af5b2affbe7419853e8dd1330e4b3fe27125 ]

    Some thread flags can be set remotely, and so even when IRQs are disabled,
    the flags can change under our feet. Thus, when setting flags we must use
    an atomic operation rather than a plain read-modify-write sequence, as a
    plain read-modify-write may discard flags which are concurrently set by a
    remote thread, e.g.

    // task A // task B
    tmp = A->thread_info.flags;
    set_tsk_thread_flag(A, NEWFLAG_B);
    tmp |= NEWFLAG_A;
    A->thread_info.flags = tmp;

    arch/powerpc/kernel/interrupt.c's system_call_exception() sets
    _TIF_RESTOREALL in the thread info flags with a read-modify-write, which
    may result in other flags being discarded.

    Elsewhere in the file it uses clear_bits() to atomically remove flag bits,
    so use set_bits() here for consistency with those.

    There may be reasons (e.g. instrumentation) that prevent the use of
    set_thread_flag() and clear_thread_flag() here, which would otherwise be

    Fixes: ae7aaecc3f2f78b7 ("powerpc/64s: system call rfscv workaround for TM bugs")
    Signed-off-by: Mark Rutland <>
    Signed-off-by: Thomas Gleixner <>
    Cc: Eirik Fuller <>
    Cc: Michael Ellerman <>
    Cc: Nicholas Piggin <>
    Signed-off-by: Sasha Levin <>
    arch/powerpc/kernel/interrupt.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/powerpc/kernel/interrupt.c b/arch/powerpc/kernel/interrupt.c
    index 835b626cd4760..df048e331cbfe 100644
    --- a/arch/powerpc/kernel/interrupt.c
    +++ b/arch/powerpc/kernel/interrupt.c
    @@ -148,7 +148,7 @@ notrace long system_call_exception(long r3, long r4, long r5,
    - current_thread_info()->flags |= _TIF_RESTOREALL;
    + set_bits(_TIF_RESTOREALL, &current_thread_info()->flags);

    * If the system call was made with a transaction active, doom it and

     \ /
      Last update: 2022-01-24 23:40    [W:3.178 / U:1.332 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site