lkml.org 
[lkml]   [2021]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv7 11/11] x86: snapshot thread flags
    Date
    Some thread flags can be set remotely, and so even when IRQs are
    disabled, the flags can change under our feet. Generally this is
    unlikely to cause a problem in practice, but it is somewhat unsound, and
    KCSAN will legitimately warn that there is a data race.

    To avoid such issues, a snapshot of the flags has to be taken prior to
    using them. Some places already use READ_ONCE() for that, others do not.

    Convert them all to the new flag accessor helpers.

    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Acked-by: Paul E. McKenney <paulmck@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    ---
    arch/x86/kernel/process.c | 8 ++++----
    arch/x86/kernel/process.h | 4 ++--
    arch/x86/mm/tlb.c | 2 +-
    3 files changed, 7 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
    index e9ee8b526319..180d7a00cb66 100644
    --- a/arch/x86/kernel/process.c
    +++ b/arch/x86/kernel/process.c
    @@ -365,7 +365,7 @@ void arch_setup_new_exec(void)
    clear_thread_flag(TIF_SSBD);
    task_clear_spec_ssb_disable(current);
    task_clear_spec_ssb_noexec(current);
    - speculation_ctrl_update(task_thread_info(current)->flags);
    + speculation_ctrl_update(read_thread_flags());
    }
    }

    @@ -617,7 +617,7 @@ static unsigned long speculation_ctrl_update_tif(struct task_struct *tsk)
    clear_tsk_thread_flag(tsk, TIF_SPEC_IB);
    }
    /* Return the updated threadinfo flags*/
    - return task_thread_info(tsk)->flags;
    + return read_task_thread_flags(tsk);
    }

    void speculation_ctrl_update(unsigned long tif)
    @@ -653,8 +653,8 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p)
    {
    unsigned long tifp, tifn;

    - tifn = READ_ONCE(task_thread_info(next_p)->flags);
    - tifp = READ_ONCE(task_thread_info(prev_p)->flags);
    + tifn = read_task_thread_flags(next_p);
    + tifp = read_task_thread_flags(prev_p);

    switch_to_bitmap(tifp);

    diff --git a/arch/x86/kernel/process.h b/arch/x86/kernel/process.h
    index 1d0797b2338a..76b547b83232 100644
    --- a/arch/x86/kernel/process.h
    +++ b/arch/x86/kernel/process.h
    @@ -13,8 +13,8 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p);
    static inline void switch_to_extra(struct task_struct *prev,
    struct task_struct *next)
    {
    - unsigned long next_tif = task_thread_info(next)->flags;
    - unsigned long prev_tif = task_thread_info(prev)->flags;
    + unsigned long next_tif = read_task_thread_flags(next);
    + unsigned long prev_tif = read_task_thread_flags(prev);

    if (IS_ENABLED(CONFIG_SMP)) {
    /*
    diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
    index 59ba2968af1b..92bb03b9ceb5 100644
    --- a/arch/x86/mm/tlb.c
    +++ b/arch/x86/mm/tlb.c
    @@ -361,7 +361,7 @@ static void l1d_flush_evaluate(unsigned long prev_mm, unsigned long next_mm,

    static unsigned long mm_mangle_tif_spec_bits(struct task_struct *next)
    {
    - unsigned long next_tif = task_thread_info(next)->flags;
    + unsigned long next_tif = read_task_thread_flags(next);
    unsigned long spec_bits = (next_tif >> TIF_SPEC_IB) & LAST_USER_MM_SPEC_MASK;

    /*
    --
    2.11.0
    \
     
     \ /
      Last update: 2021-11-17 17:32    [W:15.141 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site