Linux kernel -stable discussions
 help / color / mirror / Atom feed
* FAILED: patch "[PATCH] debugobjects: Don't call fill_pool() in early boot hardirq" failed to apply to 7.0-stable tree
@ 2026-06-15 14:31 gregkh
  2026-06-15 20:03 ` Waiman Long
  0 siblings, 1 reply; 3+ messages in thread
From: gregkh @ 2026-06-15 14:31 UTC (permalink / raw)
  To: longman, bigeasy, tglx, tglx; +Cc: stable


The patch below does not apply to the 7.0-stable tree.
If someone wants it applied there, or to any other stable or longterm
tree, then please email the backport, including the original git commit
id to <stable@vger.kernel.org>.

To reproduce the conflict and resubmit, you may use the following commands:

git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-7.0.y
git checkout FETCH_HEAD
git cherry-pick -x 0d046ae106255cba5eb83b23f78ee93f3620247d
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<stable@vger.kernel.org>' --in-reply-to '2026061558-amiable-showman-7ea7@gregkh' --subject-prefix 'PATCH 7.0.y' HEAD^..

Possible dependencies:



thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

From 0d046ae106255cba5eb83b23f78ee93f3620247d Mon Sep 17 00:00:00 2001
From: Waiman Long <longman@redhat.com>
Date: Fri, 5 Jun 2026 13:30:38 -0400
Subject: [PATCH] debugobjects: Don't call fill_pool() in early boot hardirq
 context

When booting a debug PREEMPT_RT kernel on an ARM64 system, a "inconsistent
{HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage" lockdep warning message was
reported to the console.

During early boot, interrupts are enabled before the scheduler is
enabled. In this window (before SYSTEM_SCHEDULING is set) interrupts can
fire and in the hard interrupt context handler attempt to fill the pool

This can lead to a deadlock when the interrupt occurred when the interrupt
hits a region which holds a lock that is required to be taken in the
allocation path.

Add a new can_fill_pool() helper and reorder the exception rule and forbid
this scenario by excluding allocations from hard interrupt context.

Fixes: 06e0ae988f6e ("debugobjects: Allow to refill the pool before SYSTEM_SCHEDULING")
Suggested-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260605173038.495075-1-longman@redhat.com

diff --git a/lib/debugobjects.c b/lib/debugobjects.c
index 772ddabcbe7d..1fa156c45c09 100644
--- a/lib/debugobjects.c
+++ b/lib/debugobjects.c
@@ -720,6 +720,41 @@ static inline bool debug_objects_is_pi_blocked_on(void)
 #endif
 }
 
+static inline bool can_fill_pool(void)
+{
+	/*
+	 * On !RT enabled kernels there are no restrictions and spinlock_t and
+	 * raw_spinlock_t are the same types.
+	 */
+	if (!IS_ENABLED(CONFIG_PREEMPT_RT))
+		return true;
+
+	/*
+	 * On RT enabled kernels, the task must not be blocked on a lock as
+	 * that could corrupt the PI state when blocking on a lock in the
+	 * allocation path.
+	 */
+	if (debug_objects_is_pi_blocked_on())
+		return false;
+
+	/*
+	 * On RT enabled kernels the pool refill should happen in preemptible
+	 * context.
+	 */
+	if (preemptible())
+		return true;
+
+	/*
+	 * Though during system boot before scheduling is set up, preemption is
+	 * disabled and the pool can get exhausted. Before scheduling is active
+	 * a task cannot be blocked on a sleeping lock, but it might hold a lock
+	 * and if interrupted then hard interrupt context might run into a lock
+	 * inversion. So exclude hard interrupt context from allocations before
+	 * scheduling is active.
+	 */
+	return system_state < SYSTEM_SCHEDULING && !in_hardirq();
+}
+
 static void debug_objects_fill_pool(void)
 {
 	if (!static_branch_likely(&obj_cache_enabled))
@@ -734,18 +769,11 @@ static void debug_objects_fill_pool(void)
 	if (likely(!pool_should_refill(&pool_global)))
 		return;
 
-	/*
-	 * On RT enabled kernels the pool refill must happen in preemptible
-	 * context and not enqueued on an rt_mutex -- for !RT kernels we rely
-	 * on the fact that spinlock_t and raw_spinlock_t are basically the
-	 * same type and this lock-type inversion works just fine.
-	 */
-	if (!IS_ENABLED(CONFIG_PREEMPT_RT) || system_state < SYSTEM_SCHEDULING ||
-	    (preemptible() && !debug_objects_is_pi_blocked_on())) {
+	if (can_fill_pool()) {
 		/*
 		 * Annotate away the spinlock_t inside raw_spinlock_t warning
 		 * by temporarily raising the wait-type to LD_WAIT_CONFIG, matching
-		 * the preemptible() condition above.
+		 * the preemptible() condition in can_fill_pool().
 		 */
 		static DEFINE_WAIT_OVERRIDE_MAP(fill_pool_map, LD_WAIT_CONFIG);
 		lock_map_acquire_try(&fill_pool_map);


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: FAILED: patch "[PATCH] debugobjects: Don't call fill_pool() in early boot hardirq" failed to apply to 7.0-stable tree
  2026-06-15 14:31 FAILED: patch "[PATCH] debugobjects: Don't call fill_pool() in early boot hardirq" failed to apply to 7.0-stable tree gregkh
@ 2026-06-15 20:03 ` Waiman Long
  2026-06-16  9:50   ` Greg KH
  0 siblings, 1 reply; 3+ messages in thread
From: Waiman Long @ 2026-06-15 20:03 UTC (permalink / raw)
  To: gregkh, bigeasy, tglx, tglx; +Cc: stable


On 6/15/26 10:31 AM, gregkh@linuxfoundation.org wrote:
> The patch below does not apply to the 7.0-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git commit
> id to <stable@vger.kernel.org>.
>
> To reproduce the conflict and resubmit, you may use the following commands:
>
> git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-7.0.y
> git checkout FETCH_HEAD
> git cherry-pick -x 0d046ae106255cba5eb83b23f78ee93f3620247d
> # <resolve conflicts, build, test, etc.>
> git commit -s
> git send-email --to '<stable@vger.kernel.org>' --in-reply-to '2026061558-amiable-showman-7ea7@gregkh' --subject-prefix 'PATCH 7.0.y' HEAD^..
>
> Possible dependencies:
>
>
>
> thanks,
>
> greg k-h

Commit 0d046ae10625 ("debugobjects: Don't call fill_pool() in early boot 
hardirq context") has dependency on commit 5f41161059fd ("debugobjects: 
Do not fill_pool() if pi_blocked_on") as they both modify 
debug_objects_fill_pool(). So commit 5f41161059fd has to be applied 
before commit 0d046ae10625 to avoid a merge conflict. Since both are fix 
commits, I supposed they should both be applied to v7.0.y in the right 
order. Similarly for the other stable branches.

Cheers,
Longman


>
> ------------------ original commit in Linus's tree ------------------
>
>  From 0d046ae106255cba5eb83b23f78ee93f3620247d Mon Sep 17 00:00:00 2001
> From: Waiman Long <longman@redhat.com>
> Date: Fri, 5 Jun 2026 13:30:38 -0400
> Subject: [PATCH] debugobjects: Don't call fill_pool() in early boot hardirq
>   context
>
> When booting a debug PREEMPT_RT kernel on an ARM64 system, a "inconsistent
> {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage" lockdep warning message was
> reported to the console.
>
> During early boot, interrupts are enabled before the scheduler is
> enabled. In this window (before SYSTEM_SCHEDULING is set) interrupts can
> fire and in the hard interrupt context handler attempt to fill the pool
>
> This can lead to a deadlock when the interrupt occurred when the interrupt
> hits a region which holds a lock that is required to be taken in the
> allocation path.
>
> Add a new can_fill_pool() helper and reorder the exception rule and forbid
> this scenario by excluding allocations from hard interrupt context.
>
> Fixes: 06e0ae988f6e ("debugobjects: Allow to refill the pool before SYSTEM_SCHEDULING")
> Suggested-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Waiman Long <longman@redhat.com>
> Signed-off-by: Thomas Gleixner <tglx@kernel.org>
> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Cc: stable@vger.kernel.org
> Link: https://patch.msgid.link/20260605173038.495075-1-longman@redhat.com
>
> diff --git a/lib/debugobjects.c b/lib/debugobjects.c
> index 772ddabcbe7d..1fa156c45c09 100644
> --- a/lib/debugobjects.c
> +++ b/lib/debugobjects.c
> @@ -720,6 +720,41 @@ static inline bool debug_objects_is_pi_blocked_on(void)
>   #endif
>   }
>   
> +static inline bool can_fill_pool(void)
> +{
> +	/*
> +	 * On !RT enabled kernels there are no restrictions and spinlock_t and
> +	 * raw_spinlock_t are the same types.
> +	 */
> +	if (!IS_ENABLED(CONFIG_PREEMPT_RT))
> +		return true;
> +
> +	/*
> +	 * On RT enabled kernels, the task must not be blocked on a lock as
> +	 * that could corrupt the PI state when blocking on a lock in the
> +	 * allocation path.
> +	 */
> +	if (debug_objects_is_pi_blocked_on())
> +		return false;
> +
> +	/*
> +	 * On RT enabled kernels the pool refill should happen in preemptible
> +	 * context.
> +	 */
> +	if (preemptible())
> +		return true;
> +
> +	/*
> +	 * Though during system boot before scheduling is set up, preemption is
> +	 * disabled and the pool can get exhausted. Before scheduling is active
> +	 * a task cannot be blocked on a sleeping lock, but it might hold a lock
> +	 * and if interrupted then hard interrupt context might run into a lock
> +	 * inversion. So exclude hard interrupt context from allocations before
> +	 * scheduling is active.
> +	 */
> +	return system_state < SYSTEM_SCHEDULING && !in_hardirq();
> +}
> +
>   static void debug_objects_fill_pool(void)
>   {
>   	if (!static_branch_likely(&obj_cache_enabled))
> @@ -734,18 +769,11 @@ static void debug_objects_fill_pool(void)
>   	if (likely(!pool_should_refill(&pool_global)))
>   		return;
>   
> -	/*
> -	 * On RT enabled kernels the pool refill must happen in preemptible
> -	 * context and not enqueued on an rt_mutex -- for !RT kernels we rely
> -	 * on the fact that spinlock_t and raw_spinlock_t are basically the
> -	 * same type and this lock-type inversion works just fine.
> -	 */
> -	if (!IS_ENABLED(CONFIG_PREEMPT_RT) || system_state < SYSTEM_SCHEDULING ||
> -	    (preemptible() && !debug_objects_is_pi_blocked_on())) {
> +	if (can_fill_pool()) {
>   		/*
>   		 * Annotate away the spinlock_t inside raw_spinlock_t warning
>   		 * by temporarily raising the wait-type to LD_WAIT_CONFIG, matching
> -		 * the preemptible() condition above.
> +		 * the preemptible() condition in can_fill_pool().
>   		 */
>   		static DEFINE_WAIT_OVERRIDE_MAP(fill_pool_map, LD_WAIT_CONFIG);
>   		lock_map_acquire_try(&fill_pool_map);
>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: FAILED: patch "[PATCH] debugobjects: Don't call fill_pool() in early boot hardirq" failed to apply to 7.0-stable tree
  2026-06-15 20:03 ` Waiman Long
@ 2026-06-16  9:50   ` Greg KH
  0 siblings, 0 replies; 3+ messages in thread
From: Greg KH @ 2026-06-16  9:50 UTC (permalink / raw)
  To: Waiman Long; +Cc: bigeasy, tglx, tglx, stable

On Mon, Jun 15, 2026 at 04:03:09PM -0400, Waiman Long wrote:
> 
> On 6/15/26 10:31 AM, gregkh@linuxfoundation.org wrote:
> > The patch below does not apply to the 7.0-stable tree.
> > If someone wants it applied there, or to any other stable or longterm
> > tree, then please email the backport, including the original git commit
> > id to <stable@vger.kernel.org>.
> > 
> > To reproduce the conflict and resubmit, you may use the following commands:
> > 
> > git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-7.0.y
> > git checkout FETCH_HEAD
> > git cherry-pick -x 0d046ae106255cba5eb83b23f78ee93f3620247d
> > # <resolve conflicts, build, test, etc.>
> > git commit -s
> > git send-email --to '<stable@vger.kernel.org>' --in-reply-to '2026061558-amiable-showman-7ea7@gregkh' --subject-prefix 'PATCH 7.0.y' HEAD^..
> > 
> > Possible dependencies:
> > 
> > 
> > 
> > thanks,
> > 
> > greg k-h
> 
> Commit 0d046ae10625 ("debugobjects: Don't call fill_pool() in early boot
> hardirq context") has dependency on commit 5f41161059fd ("debugobjects: Do
> not fill_pool() if pi_blocked_on") as they both modify
> debug_objects_fill_pool(). So commit 5f41161059fd has to be applied before
> commit 0d046ae10625 to avoid a merge conflict. Since both are fix commits, I
> supposed they should both be applied to v7.0.y in the right order. Similarly
> for the other stable branches.

That only worked for 7.0.y, which I've done, but it fails to apply to
all older trees.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-06-16  9:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-15 14:31 FAILED: patch "[PATCH] debugobjects: Don't call fill_pool() in early boot hardirq" failed to apply to 7.0-stable tree gregkh
2026-06-15 20:03 ` Waiman Long
2026-06-16  9:50   ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox