From: <gregkh@linuxfoundation.org>
To: Julia.Lawall@inria.fr,aha310510@gmail.com,akpm@linux-foundation.org,anna-maria@linutronix.de,arnd@arndb.de,gregkh@linuxfoundation.org,jacob.e.keller@intel.com,linux-staging@lists.linux.dev,linux@roeck-us.net,luiz.dentz@gmail.com,marcel@holtmann.org,maz@kernel.org,peterz@infradead.org,rostedt@goodmis.org,sboyd@kernel.org,tglx@linutronix.de,viresh.kumar@linaro.org,zouyipeng@huawei.com
Cc: <stable-commits@vger.kernel.org>
Subject: Patch "timers: Split [try_to_]del_timer[_sync]() to prepare for shutdown mode" has been added to the 5.10-stable tree
Date: Thu, 23 Apr 2026 14:35:08 +0200 [thread overview]
Message-ID: <2026042308-stencil-relay-aaff@gregkh> (raw)
In-Reply-To: <20260219171310.118170-11-aha310510@gmail.com>
This is a note to let you know that I've just added the patch titled
timers: Split [try_to_]del_timer[_sync]() to prepare for shutdown mode
to the 5.10-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:
timers-split-del_timer-to-prepare-for-shutdown-mode.patch
and it can be found in the queue-5.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@vger.kernel.org> know about it.
From aha310510@gmail.com Thu Feb 19 18:13:58 2026
From: Jeongjun Park <aha310510@gmail.com>
Date: Fri, 20 Feb 2026 02:13:05 +0900
Subject: timers: Split [try_to_]del_timer[_sync]() to prepare for shutdown mode
To: stable@vger.kernel.org
Cc: gregkh@linuxfoundation.org, tglx@linutronix.de, Julia.Lawall@inria.fr, akpm@linux-foundation.org, anna-maria@linutronix.de, arnd@arndb.de, linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, linux@roeck-us.net, luiz.dentz@gmail.com, marcel@holtmann.org, maz@kernel.org, peterz@infradead.org, rostedt@goodmis.org, sboyd@kernel.org, viresh.kumar@linaro.org, zouyipeng@huawei.com, aha310510@gmail.com, linux-staging@lists.linux.dev, Jacob Keller <jacob.e.keller@intel.com>
Message-ID: <20260219171310.118170-11-aha310510@gmail.com>
From: Thomas Gleixner <tglx@linutronix.de>
[ Upstream commit 8553b5f2774a66b1f293b7d783934210afb8f23c ]
Tearing down timers which have circular dependencies to other
functionality, e.g. workqueues, where the timer can schedule work and work
can arm timers, is not trivial.
In those cases it is desired to shutdown the timer in a way which prevents
rearming of the timer. The mechanism to do so is to set timer->function to
NULL and use this as an indicator for the timer arming functions to ignore
the (re)arm request.
Split the inner workings of try_do_del_timer_sync(), del_timer_sync() and
del_timer() into helper functions to prepare for implementing the shutdown
functionality.
No functional change.
Co-developed-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Anna-Maria Behnsen <anna-maria@linutronix.de>
Link: https://lore.kernel.org/all/20220407161745.7d6754b3@gandalf.local.home
Link: https://lore.kernel.org/all/20221110064101.429013735@goodmis.org
Link: https://lore.kernel.org/r/20221123201625.195147423@linutronix.de
Signed-off-by: Jeongjun Park <aha310510@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
kernel/time/timer.c | 135 +++++++++++++++++++++++++++++++++-------------------
1 file changed, 88 insertions(+), 47 deletions(-)
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -1245,20 +1245,14 @@ out_unlock:
EXPORT_SYMBOL_GPL(add_timer_on);
/**
- * timer_delete - Deactivate a timer
+ * __timer_delete - Internal function: Deactivate a timer
* @timer: The timer to be deactivated
*
- * The function only deactivates a pending timer, but contrary to
- * timer_delete_sync() it does not take into account whether the timer's
- * callback function is concurrently executed on a different CPU or not.
- * It neither prevents rearming of the timer. If @timer can be rearmed
- * concurrently then the return value of this function is meaningless.
- *
* Return:
* * %0 - The timer was not pending
* * %1 - The timer was pending and deactivated
*/
-int timer_delete(struct timer_list *timer)
+static int __timer_delete(struct timer_list *timer)
{
struct timer_base *base;
unsigned long flags;
@@ -1274,25 +1268,37 @@ int timer_delete(struct timer_list *time
return ret;
}
-EXPORT_SYMBOL(timer_delete);
/**
- * try_to_del_timer_sync - Try to deactivate a timer
- * @timer: Timer to deactivate
+ * timer_delete - Deactivate a timer
+ * @timer: The timer to be deactivated
*
- * This function tries to deactivate a timer. On success the timer is not
- * queued and the timer callback function is not running on any CPU.
+ * The function only deactivates a pending timer, but contrary to
+ * timer_delete_sync() it does not take into account whether the timer's
+ * callback function is concurrently executed on a different CPU or not.
+ * It neither prevents rearming of the timer. If @timer can be rearmed
+ * concurrently then the return value of this function is meaningless.
*
- * This function does not guarantee that the timer cannot be rearmed right
- * after dropping the base lock. That needs to be prevented by the calling
- * code if necessary.
+ * Return:
+ * * %0 - The timer was not pending
+ * * %1 - The timer was pending and deactivated
+ */
+int timer_delete(struct timer_list *timer)
+{
+ return __timer_delete(timer);
+}
+EXPORT_SYMBOL(timer_delete);
+
+/**
+ * __try_to_del_timer_sync - Internal function: Try to deactivate a timer
+ * @timer: Timer to deactivate
*
* Return:
* * %0 - The timer was not pending
* * %1 - The timer was pending and deactivated
* * %-1 - The timer callback function is running on a different CPU
*/
-int try_to_del_timer_sync(struct timer_list *timer)
+static int __try_to_del_timer_sync(struct timer_list *timer)
{
struct timer_base *base;
unsigned long flags;
@@ -1309,6 +1315,27 @@ int try_to_del_timer_sync(struct timer_l
return ret;
}
+
+/**
+ * try_to_del_timer_sync - Try to deactivate a timer
+ * @timer: Timer to deactivate
+ *
+ * This function tries to deactivate a timer. On success the timer is not
+ * queued and the timer callback function is not running on any CPU.
+ *
+ * This function does not guarantee that the timer cannot be rearmed right
+ * after dropping the base lock. That needs to be prevented by the calling
+ * code if necessary.
+ *
+ * Return:
+ * * %0 - The timer was not pending
+ * * %1 - The timer was pending and deactivated
+ * * %-1 - The timer callback function is running on a different CPU
+ */
+int try_to_del_timer_sync(struct timer_list *timer)
+{
+ return __try_to_del_timer_sync(timer);
+}
EXPORT_SYMBOL(try_to_del_timer_sync);
#ifdef CONFIG_PREEMPT_RT
@@ -1385,6 +1412,49 @@ static inline void del_timer_wait_runnin
#endif
/**
+ * __timer_delete_sync - Internal function: Deactivate a timer and wait
+ * for the handler to finish.
+ * @timer: The timer to be deactivated
+ *
+ * Return:
+ * * %0 - The timer was not pending
+ * * %1 - The timer was pending and deactivated
+ */
+static int __timer_delete_sync(struct timer_list *timer)
+{
+ int ret;
+
+#ifdef CONFIG_LOCKDEP
+ unsigned long flags;
+
+ /*
+ * If lockdep gives a backtrace here, please reference
+ * the synchronization rules above.
+ */
+ local_irq_save(flags);
+ lock_map_acquire(&timer->lockdep_map);
+ lock_map_release(&timer->lockdep_map);
+ local_irq_restore(flags);
+#endif
+ /*
+ * don't use it in hardirq context, because it
+ * could lead to deadlock.
+ */
+ WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE));
+
+ do {
+ ret = __try_to_del_timer_sync(timer);
+
+ if (unlikely(ret < 0)) {
+ del_timer_wait_running(timer);
+ cpu_relax();
+ }
+ } while (ret < 0);
+
+ return ret;
+}
+
+/**
* timer_delete_sync - Deactivate a timer and wait for the handler to finish.
* @timer: The timer to be deactivated
*
@@ -1425,36 +1495,7 @@ static inline void del_timer_wait_runnin
*/
int timer_delete_sync(struct timer_list *timer)
{
- int ret;
-
-#ifdef CONFIG_LOCKDEP
- unsigned long flags;
-
- /*
- * If lockdep gives a backtrace here, please reference
- * the synchronization rules above.
- */
- local_irq_save(flags);
- lock_map_acquire(&timer->lockdep_map);
- lock_map_release(&timer->lockdep_map);
- local_irq_restore(flags);
-#endif
- /*
- * don't use it in hardirq context, because it
- * could lead to deadlock.
- */
- WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE));
-
- do {
- ret = try_to_del_timer_sync(timer);
-
- if (unlikely(ret < 0)) {
- del_timer_wait_running(timer);
- cpu_relax();
- }
- } while (ret < 0);
-
- return ret;
+ return __timer_delete_sync(timer);
}
EXPORT_SYMBOL(timer_delete_sync);
Patches currently in stable-queue which might be from aha310510@gmail.com are
queue-5.10/timers-update-the-documentation-to-reflect-on-the-new-timer_shutdown-api.patch
queue-5.10/clocksource-drivers-arm_arch_timer-do-not-use-timer-namespace-for-timer_shutdown-function.patch
queue-5.10/timers-split-del_timer-to-prepare-for-shutdown-mode.patch
queue-5.10/arm-spear-do-not-use-timer-namespace-for-timer_shutdown-function.patch
queue-5.10/media-as102-fix-to-not-free-memory-after-the-device-is-registered-in-as102_usb_probe.patch
queue-5.10/timers-add-shutdown-mechanism-to-the-internal-functions.patch
queue-5.10/timers-provide-timer_shutdown.patch
queue-5.10/timers-rename-del_timer-to-timer_delete.patch
queue-5.10/timers-replace-bug_on-s.patch
queue-5.10/bluetooth-hci_qca-fix-the-teardown-problem-for-real.patch
queue-5.10/timers-fix-null-function-pointer-race-in-timer_shutdown_sync.patch
queue-5.10/documentation-replace-del_timer-del_timer_sync.patch
queue-5.10/documentation-remove-bogus-claim-about-del_timer_sync.patch
queue-5.10/timers-silently-ignore-timers-with-a-null-function.patch
queue-5.10/timers-get-rid-of-del_singleshot_timer_sync.patch
queue-5.10/media-hackrf-fix-to-not-free-memory-after-the-device-is-registered-in-hackrf_probe.patch
queue-5.10/clocksource-drivers-sp804-do-not-use-timer-namespace-for-timer_shutdown-function.patch
next prev parent reply other threads:[~2026-04-23 12:35 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-19 17:12 [PATCH 5.10.y 00/15] timers: Provide timer_shutdown[_sync]() Jeongjun Park
2026-02-19 17:12 ` [PATCH 5.10.y 01/15] Documentation: Remove bogus claim about del_timer_sync() Jeongjun Park
2026-04-23 12:35 ` Patch "Documentation: Remove bogus claim about del_timer_sync()" has been added to the 5.10-stable tree gregkh
2026-02-19 17:12 ` [PATCH 5.10.y 02/15] ARM: spear: Do not use timer namespace for timer_shutdown() function Jeongjun Park
2026-04-23 12:35 ` Patch "ARM: spear: Do not use timer namespace for timer_shutdown() function" has been added to the 5.10-stable tree gregkh
2026-02-19 17:12 ` [PATCH 5.10.y 03/15] clocksource/drivers/arm_arch_timer: Do not use timer namespace for timer_shutdown() function Jeongjun Park
2026-04-23 12:35 ` Patch "clocksource/drivers/arm_arch_timer: Do not use timer namespace for timer_shutdown() function" has been added to the 5.10-stable tree gregkh
2026-02-19 17:12 ` [PATCH 5.10.y 04/15] clocksource/drivers/sp804: Do not use timer namespace for timer_shutdown() function Jeongjun Park
2026-04-23 12:35 ` Patch "clocksource/drivers/sp804: Do not use timer namespace for timer_shutdown() function" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 05/15] timers: Get rid of del_singleshot_timer_sync() Jeongjun Park
2026-04-23 12:35 ` Patch "timers: Get rid of del_singleshot_timer_sync()" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 06/15] timers: Replace BUG_ON()s Jeongjun Park
2026-04-23 12:35 ` Patch "timers: Replace BUG_ON()s" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 07/15] timers: Rename del_timer() to timer_delete() Jeongjun Park
2026-04-23 12:35 ` Patch "timers: Rename del_timer() to timer_delete()" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 08/15] Documentation: Replace del_timer/del_timer_sync() Jeongjun Park
2026-04-23 12:35 ` Patch "Documentation: Replace del_timer/del_timer_sync()" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 09/15] timers: Silently ignore timers with a NULL function Jeongjun Park
2026-04-23 12:35 ` Patch "timers: Silently ignore timers with a NULL function" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 10/15] timers: Split [try_to_]del_timer[_sync]() to prepare for shutdown mode Jeongjun Park
2026-04-23 12:35 ` gregkh [this message]
2026-02-19 17:13 ` [PATCH 5.10.y 11/15] timers: Add shutdown mechanism to the internal functions Jeongjun Park
2026-04-23 12:35 ` Patch "timers: Add shutdown mechanism to the internal functions" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 12/15] timers: Provide timer_shutdown[_sync]() Jeongjun Park
2026-04-23 12:35 ` Patch "timers: Provide timer_shutdown[_sync]()" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 13/15] timers: Update the documentation to reflect on the new timer_shutdown() API Jeongjun Park
2026-04-23 12:35 ` Patch "timers: Update the documentation to reflect on the new timer_shutdown() API" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 14/15] Bluetooth: hci_qca: Fix the teardown problem for real Jeongjun Park
2026-04-23 12:35 ` Patch "Bluetooth: hci_qca: Fix the teardown problem for real" has been added to the 5.10-stable tree gregkh
2026-02-19 17:13 ` [PATCH 5.10.y 15/15] timers: Fix NULL function pointer race in timer_shutdown_sync() Jeongjun Park
2026-02-19 17:17 ` Jeongjun Park
2026-04-23 12:35 ` Patch "timers: Fix NULL function pointer race in timer_shutdown_sync()" has been added to the 5.10-stable tree gregkh
2026-04-23 12:49 ` [PATCH 5.10.y 00/15] timers: Provide timer_shutdown[_sync]() Greg KH
2026-04-23 13:36 ` Jeongjun Park
2026-04-23 13:43 ` Greg KH
2026-04-23 14:07 ` Jeongjun Park
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2026042308-stencil-relay-aaff@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=Julia.Lawall@inria.fr \
--cc=aha310510@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=anna-maria@linutronix.de \
--cc=arnd@arndb.de \
--cc=jacob.e.keller@intel.com \
--cc=linux-staging@lists.linux.dev \
--cc=linux@roeck-us.net \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
--cc=maz@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=sboyd@kernel.org \
--cc=stable-commits@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=viresh.kumar@linaro.org \
--cc=zouyipeng@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox