lkml.org 
[lkml]   [2019]   [Mar]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 35/78] sched/wait: Fix rcuwait_wake_up() ordering
    Date
    4.19-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    [ Upstream commit 6dc080eeb2ba01973bfff0d79844d7a59e12542e ]

    For some peculiar reason rcuwait_wake_up() has the right barrier in
    the comment, but not in the code.

    This mistake has been observed to cause a deadlock in the following
    situation:

    P1 P2

    percpu_up_read() percpu_down_write()
    rcu_sync_is_idle() // false
    rcu_sync_enter()
    ...
    __percpu_up_read()

    [S] ,- __this_cpu_dec(*sem->read_count)
    | smp_rmb();
    [L] | task = rcu_dereference(w->task) // NULL
    |
    | [S] w->task = current
    | smp_mb();
    | [L] readers_active_check() // fail
    `-> <store happens here>

    Where the smp_rmb() (obviously) fails to constrain the store.

    [ peterz: Added changelog. ]

    Signed-off-by: Prateek Sood <prsood@codeaurora.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Andrea Parri <andrea.parri@amarulasolutions.com>
    Acked-by: Davidlohr Bueso <dbueso@suse.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: 8f95c90ceb54 ("sched/wait, RCU: Introduce rcuwait machinery")
    Link: https://lkml.kernel.org/r/1543590656-7157-1-git-send-email-prsood@codeaurora.org
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/exit.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/kernel/exit.c b/kernel/exit.c
    index 55b4fa6d01ebd..d607e23fd0c3e 100644
    --- a/kernel/exit.c
    +++ b/kernel/exit.c
    @@ -307,7 +307,7 @@ void rcuwait_wake_up(struct rcuwait *w)
    * MB (A) MB (B)
    * [L] cond [L] tsk
    */
    - smp_rmb(); /* (B) */
    + smp_mb(); /* (B) */

    /*
    * Avoid using task_rcu_dereference() magic as long as we are careful,
    --
    2.19.1


    \
     
     \ /
      Last update: 2019-03-04 09:45    [W:4.560 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site