From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from shelob.surriel.com (shelob.surriel.com [96.67.55.147]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 40B31303CAB for ; Thu, 11 Jun 2026 02:14:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=96.67.55.147 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781144096; cv=none; b=Oekm6RGcTngULsAMkdwgxDl4HnXwngpMlLvuBOlPkmkXglY45L4nurLcsiPv0Buoi0POUebVIh+KZgXBKA7tn79p7XIEJkm33AKtjGDPklA6MfllgD8leAf75D9Hqr6c9St4KlJliIZc5dft5S5iUjWN/k4eEIL+/ffiybhHgVQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781144096; c=relaxed/simple; bh=EoFMMFvYtd3KwEE2bz/owpcliSE5uvVbh2vrj6eHy84=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U26CY2Qew81RMAwW5Q5VgmMxCl/cYr7O0MiwxXM3391pDnXX186KonInkyTjlQOJ+OeyjOZMbp5XZDnK9jtaRqww8IFX9iv3wRE150sImerpl6bCKRS04w8ApA+gaAe8HE/hZkNTEUnrLn2tGmglNJB+I3HkpwamSTaFGMiYYDw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=surriel.com; spf=pass smtp.mailfrom=surriel.com; dkim=pass (2048-bit key) header.d=surriel.com header.i=@surriel.com header.b=l+eBcObO; arc=none smtp.client-ip=96.67.55.147 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=surriel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=surriel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=surriel.com header.i=@surriel.com header.b="l+eBcObO" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=surriel.com ; s=mail; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=2uqwQ7UqX/n67dVapnQYycpDn/yKI/5nBsGPovRZbWk=; b=l+eBcObOcijukzCvoQmwP/+3eg 6zS2NtvbfR6f/Na+ijJ5YKjiOFKwu5rYPSpTmn0Byf6EZt5p1rHnYfwZsQbCZV6Bul0h12x/cNZwH g3cZWemnSmFypIUolf5LvW+Nee4EaMj3XCB4oPcEEI1rdaIm9rmh7TdQreVSX+RVnX/+80XAV+MtX /5eq7j4KXpN15CVHw4B0MPl7621s/zRbtlsVvxP3/SUuL2dfstKtNq4sUBDsFpQZtCpBq52lRPeJC hHJ+3zZRyGGwdYBR3dyLxZeZbWkQiBstCwbaksHUijDaEWuc6PDDPyMzT33Jjob0IrNLKNHC7k5r3 VUHddfkQ==; Received: from fangorn.home.surriel.com ([10.0.13.7]) by shelob.surriel.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1wXUwJ-000000003Zo-0YLJ; Wed, 10 Jun 2026 22:14:39 -0400 From: Rik van Riel To: linux-kernel@vger.kernel.org Cc: kernel-team@meta.com, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, vschneid@redhat.com, Rik van Riel Subject: [PATCH 5/9] sched/rt: defer WARN console output under rq->lock Date: Wed, 10 Jun 2026 22:14:12 -0400 Message-ID: <20260611021416.910555-6-riel@surriel.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260611021416.910555-1-riel@surriel.com> References: <20260611021416.910555-1-riel@surriel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Convert the WARN*() calls that run under rq->lock or ->pi_lock to the SCHED_WARN*() variants, so their console output is deferred to irq_work instead of being emitted synchronously (which can deadlock via console_unlock() -> up(&console_sem) -> try_to_wake_up() while the lock is held). This should prevent a deadlock if these warnings fire with a legacy or boot console configured. Signed-off-by: Rik van Riel Assisted-by: Claude:claude-opus-4-8 --- kernel/sched/rt.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index e474c31d8fe6..adbb8f3d6510 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -170,7 +170,7 @@ static void destroy_rt_bandwidth(struct rt_bandwidth *rt_b) static inline struct task_struct *rt_task_of(struct sched_rt_entity *rt_se) { - WARN_ON_ONCE(!rt_entity_is_task(rt_se)); + SCHED_WARN_ON_ONCE(!rt_entity_is_task(rt_se)); return container_of(rt_se, struct task_struct, rt); } @@ -178,13 +178,13 @@ static inline struct task_struct *rt_task_of(struct sched_rt_entity *rt_se) static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq) { /* Cannot fold with non-CONFIG_RT_GROUP_SCHED version, layout */ - WARN_ON(!rt_group_sched_enabled() && rt_rq->tg != &root_task_group); + SCHED_WARN_ON(!rt_group_sched_enabled() && rt_rq->tg != &root_task_group); return rt_rq->rq; } static inline struct rt_rq *rt_rq_of_se(struct sched_rt_entity *rt_se) { - WARN_ON(!rt_group_sched_enabled() && rt_se->rt_rq->tg != &root_task_group); + SCHED_WARN_ON(!rt_group_sched_enabled() && rt_se->rt_rq->tg != &root_task_group); return rt_se->rt_rq; } @@ -192,7 +192,7 @@ static inline struct rq *rq_of_rt_se(struct sched_rt_entity *rt_se) { struct rt_rq *rt_rq = rt_se->rt_rq; - WARN_ON(!rt_group_sched_enabled() && rt_rq->tg != &root_task_group); + SCHED_WARN_ON(!rt_group_sched_enabled() && rt_rq->tg != &root_task_group); return rt_rq->rq; } @@ -723,7 +723,7 @@ static void __disable_runtime(struct rq *rq) * We cannot be left wanting - that would mean some runtime * leaked out of the system. */ - WARN_ON_ONCE(want); + SCHED_WARN_ON_ONCE(want); balanced: /* * Disable all the borrow logic by pretending we have inf @@ -1094,7 +1094,7 @@ dec_rt_prio(struct rt_rq *rt_rq, int prio) if (rt_rq->rt_nr_running) { - WARN_ON(prio < prev_prio); + SCHED_WARN_ON(prio < prev_prio); /* * This may have been our highest task, and therefore @@ -1131,7 +1131,7 @@ dec_rt_group(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) if (rt_se_boosted(rt_se)) rt_rq->rt_nr_boosted--; - WARN_ON(!rt_rq->rt_nr_running && rt_rq->rt_nr_boosted); + SCHED_WARN_ON(!rt_rq->rt_nr_running && rt_rq->rt_nr_boosted); } #else /* !CONFIG_RT_GROUP_SCHED: */ @@ -1176,7 +1176,7 @@ void inc_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) { int prio = rt_se_prio(rt_se); - WARN_ON(!rt_prio(prio)); + SCHED_WARN_ON(!rt_prio(prio)); rt_rq->rt_nr_running += rt_se_nr_running(rt_se); rt_rq->rr_nr_running += rt_se_rr_nr_running(rt_se); @@ -1187,8 +1187,8 @@ void inc_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) static inline void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) { - WARN_ON(!rt_prio(rt_se_prio(rt_se))); - WARN_ON(!rt_rq->rt_nr_running); + SCHED_WARN_ON(!rt_prio(rt_se_prio(rt_se))); + SCHED_WARN_ON(!rt_rq->rt_nr_running); rt_rq->rt_nr_running -= rt_se_nr_running(rt_se); rt_rq->rr_nr_running -= rt_se_rr_nr_running(rt_se); @@ -1348,7 +1348,7 @@ static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flag } if (move_entity(flags)) { - WARN_ON_ONCE(rt_se->on_list); + SCHED_WARN_ON_ONCE(rt_se->on_list); if (flags & ENQUEUE_HEAD) list_add(&rt_se->run_list, queue); else @@ -1368,7 +1368,7 @@ static void __dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flag struct rt_prio_array *array = &rt_rq->active; if (move_entity(flags)) { - WARN_ON_ONCE(!rt_se->on_list); + SCHED_WARN_ON_ONCE(!rt_se->on_list); __delist_rt_entity(rt_se, array); } rt_se->on_rq = 0; @@ -1690,7 +1690,7 @@ static struct sched_rt_entity *pick_next_rt_entity(struct rt_rq *rt_rq) BUG_ON(idx >= MAX_RT_PRIO); queue = array->queue + idx; - if (WARN_ON_ONCE(list_empty(queue))) + if (SCHED_WARN_ON_ONCE(list_empty(queue))) return NULL; next = list_entry(queue->next, struct sched_rt_entity, run_list); @@ -2022,7 +2022,7 @@ static int push_rt_task(struct rq *rq, bool pull) return 0; } - if (WARN_ON(next_task == rq->curr)) + if (SCHED_WARN_ON(next_task == rq->curr)) return 0; /* We might release rq lock */ @@ -2322,8 +2322,8 @@ static void pull_rt_task(struct rq *this_rq) * the to-be-scheduled task? */ if (p && (p->prio < this_rq->rt.highest_prio.curr)) { - WARN_ON(p == src_rq->curr); - WARN_ON(!task_on_rq_queued(p)); + SCHED_WARN_ON(p == src_rq->curr); + SCHED_WARN_ON(!task_on_rq_queued(p)); /* * There's a chance that p is higher in priority @@ -2589,7 +2589,7 @@ static int task_is_throttled_rt(struct task_struct *p, int cpu) #ifdef CONFIG_RT_GROUP_SCHED // XXX maybe add task_rt_rq(), see also sched_rt_period_rt_rq rt_rq = task_group(p)->rt_rq[cpu]; - WARN_ON(!rt_group_sched_enabled() && rt_rq->tg != &root_task_group); + SCHED_WARN_ON(!rt_group_sched_enabled() && rt_rq->tg != &root_task_group); #else rt_rq = &cpu_rq(cpu)->rt; #endif -- 2.53.0-Meta