]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 6.6
authorSasha Levin <sashal@kernel.org>
Sat, 9 Nov 2024 14:55:48 +0000 (09:55 -0500)
committerSasha Levin <sashal@kernel.org>
Sat, 9 Nov 2024 14:55:48 +0000 (09:55 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-6.6/posix-cpu-timers-clear-tick_dep_bit_posix_timer-on-c.patch [new file with mode: 0644]
queue-6.6/series

diff --git a/queue-6.6/posix-cpu-timers-clear-tick_dep_bit_posix_timer-on-c.patch b/queue-6.6/posix-cpu-timers-clear-tick_dep_bit_posix_timer-on-c.patch
new file mode 100644 (file)
index 0000000..b302ad3
--- /dev/null
@@ -0,0 +1,92 @@
+From 1c4299c7f6a1ce55bb492a4ca9d53b1e32d3d9ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 25 Oct 2024 18:35:35 -0700
+Subject: posix-cpu-timers: Clear TICK_DEP_BIT_POSIX_TIMER on clone
+
+From: Benjamin Segall <bsegall@google.com>
+
+[ 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@google.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/all/xm26o737bq8o.fsf@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/tick.h | 8 ++++++++
+ kernel/fork.c        | 2 ++
+ 2 files changed, 10 insertions(+)
+
+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 9098284720e38..23efaa2c42e4f 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -99,6 +99,7 @@
+ #include <linux/stackprotector.h>
+ #include <linux/user_events.h>
+ #include <linux/iommu.h>
++#include <linux/tick.h>
+ #include <asm/pgalloc.h>
+ #include <linux/uaccess.h>
+@@ -2418,6 +2419,7 @@ __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);
+-- 
+2.43.0
+
index ad6ca1fd9fb6b0b989b35e7f2441182fbf45aa15..1760dd2043804971b8556b95421f94824e7e3790 100644 (file)
@@ -71,3 +71,4 @@ ksmbd-fix-slab-use-after-free-in-ksmbd_smb2_session_create.patch
 ksmbd-check-outstanding-simultaneous-smb-operations.patch
 ksmbd-fix-the-missing-xa_store-error-check.patch
 ksmbd-fix-slab-use-after-free-in-smb3_preauth_hash_rsp.patch
+posix-cpu-timers-clear-tick_dep_bit_posix_timer-on-c.patch