Patch "posix-cpu-timers: Clear TICK_DEP_BIT_POSIX_TIMER on clone" has been added to the 6.1-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

    posix-cpu-timers: Clear TICK_DEP_BIT_POSIX_TIMER on clone

to the 6.1-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:
     posix-cpu-timers-clear-tick_dep_bit_posix_timer-on-c.patch
and it can be found in the queue-6.1 subdirectory.

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



commit 252f6523765471af2d5b8991d24787dc527aa49c
Author: Benjamin Segall <bsegall@xxxxxxxxxx>
Date:   Fri Oct 25 18:35:35 2024 -0700

    posix-cpu-timers: Clear TICK_DEP_BIT_POSIX_TIMER on clone
    
    [ Upstream commit b5413156bad91dc2995a5c4eab1b05e56914638a ]
    
    When cloning a new thread, its posix_cputimers are not inherited, and
    are cleared by posix_cputimers_init(). However, this does not clear the
    tick dependency it creates in tsk->tick_dep_mask, and the handler does
    not reach the code to clear the dependency if there were no timers to
    begin with.
    
    Thus if a thread has a cputimer running before clone/fork, all
    descendants will prevent nohz_full unless they create a cputimer of
    their own.
    
    Fix this by entirely clearing the tick_dep_mask in copy_process().
    (There is currently no inherited state that needs a tick dependency)
    
    Process-wide timers do not have this problem because fork does not copy
    signal_struct as a baseline, it creates one from scratch.
    
    Fixes: b78783000d5c ("posix-cpu-timers: Migrate to use new tick dependency mask model")
    Signed-off-by: Ben Segall <bsegall@xxxxxxxxxx>
    Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Reviewed-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
    Cc: stable@xxxxxxxxxxxxxxx
    Link: https://lore.kernel.org/all/xm26o737bq8o.fsf@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/linux/tick.h b/include/linux/tick.h
index 9459fef5b8573..9701c571a5cfe 100644
--- a/include/linux/tick.h
+++ b/include/linux/tick.h
@@ -252,12 +252,19 @@ static inline void tick_dep_set_task(struct task_struct *tsk,
 	if (tick_nohz_full_enabled())
 		tick_nohz_dep_set_task(tsk, bit);
 }
+
 static inline void tick_dep_clear_task(struct task_struct *tsk,
 				       enum tick_dep_bits bit)
 {
 	if (tick_nohz_full_enabled())
 		tick_nohz_dep_clear_task(tsk, bit);
 }
+
+static inline void tick_dep_init_task(struct task_struct *tsk)
+{
+	atomic_set(&tsk->tick_dep_mask, 0);
+}
+
 static inline void tick_dep_set_signal(struct task_struct *tsk,
 				       enum tick_dep_bits bit)
 {
@@ -291,6 +298,7 @@ static inline void tick_dep_set_task(struct task_struct *tsk,
 				     enum tick_dep_bits bit) { }
 static inline void tick_dep_clear_task(struct task_struct *tsk,
 				       enum tick_dep_bits bit) { }
+static inline void tick_dep_init_task(struct task_struct *tsk) { }
 static inline void tick_dep_set_signal(struct task_struct *tsk,
 				       enum tick_dep_bits bit) { }
 static inline void tick_dep_clear_signal(struct signal_struct *signal,
diff --git a/kernel/fork.c b/kernel/fork.c
index 8dd46baee4c39..09a935724bd95 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -97,6 +97,7 @@
 #include <linux/scs.h>
 #include <linux/io_uring.h>
 #include <linux/bpf.h>
+#include <linux/tick.h>
 
 #include <asm/pgalloc.h>
 #include <linux/uaccess.h>
@@ -2183,6 +2184,7 @@ static __latent_entropy struct task_struct *copy_process(
 	acct_clear_integrals(p);
 
 	posix_cputimers_init(&p->posix_cputimers);
+	tick_dep_init_task(p);
 
 	p->io_context = NULL;
 	audit_set_context(p, NULL);




[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