Patch "entry/rcu: Check TIF_RESCHED _after_ delayed RCU wake-up" has been added to the 6.2-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    entry/rcu: Check TIF_RESCHED _after_ delayed RCU wake-up

to the 6.2-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     entry-rcu-check-tif_resched-_after_-delayed-rcu-wake.patch
and it can be found in the queue-6.2 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 1ed3af96022a3b36931d3b80693d557e8fe91913
Author: Frederic Weisbecker <frederic@xxxxxxxxxx>
Date:   Wed Mar 15 19:43:43 2023 +0000

    entry/rcu: Check TIF_RESCHED _after_ delayed RCU wake-up
    
    [ Upstream commit b416514054810cf2d2cc348ae477cea619b64da7 ]
    
    RCU sometimes needs to perform a delayed wake up for specific kthreads
    handling offloaded callbacks (RCU_NOCB).  These wakeups are performed
    by timers and upon entry to idle (also to guest and to user on nohz_full).
    
    However the delayed wake-up on kernel exit is actually performed after
    the thread flags are fetched towards the fast path check for work to
    do on exit to user. As a result, and if there is no other pending work
    to do upon that kernel exit, the current task will resume to userspace
    with TIF_RESCHED set and the pending wake up ignored.
    
    Fix this with fetching the thread flags _after_ the delayed RCU-nocb
    kthread wake-up.
    
    Fixes: 47b8ff194c1f ("entry: Explicitly flush pending rcuog wakeup before last rescheduling point")
    Signed-off-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
    Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx>
    Signed-off-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx>
    Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230315194349.10798-3-joel@xxxxxxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/entry/common.c b/kernel/entry/common.c
index 1314894d2efad..be61332c66b54 100644
--- a/kernel/entry/common.c
+++ b/kernel/entry/common.c
@@ -192,13 +192,14 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs,
 
 static void exit_to_user_mode_prepare(struct pt_regs *regs)
 {
-	unsigned long ti_work = read_thread_flags();
+	unsigned long ti_work;
 
 	lockdep_assert_irqs_disabled();
 
 	/* Flush pending rcuog wakeup before the last need_resched() check */
 	tick_nohz_user_enter_prepare();
 
+	ti_work = read_thread_flags();
 	if (unlikely(ti_work & EXIT_TO_USER_MODE_WORK))
 		ti_work = exit_to_user_mode_loop(regs, ti_work);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux