[RFC PATCH v5 29/29] sched/rt: Add debug BUG_ONs in migration code

Yuri Andriaccio
2026-04-30T21:39:28Z

Add debug BUG_ONs in group specific migration functions.
Can be safely added after all the migration patches.

These are extra asserts which are only useful to debug the kernel code and
are not meant to be part of the final patchset.

Signed-off-by: Yuri Andriaccio <yurand2000@gmail.com>
---
kernel/sched/rt.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)

diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 6cecda2ce812..9f938ce84485 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -370,6 +370,9 @@ static void rt_queue_push_from_group(struct rt_rq *rt_rq)
struct rq *rq = served_rq_of_rt_rq(rt_rq);
struct rq *global_rq = cpu_rq(rq->cpu);

+ BUG_ON(rt_rq == NULL);
+ BUG_ON(rq == global_rq);
+
if (global_rq->rq_to_push_from)
return;

@@ -387,6 +390,10 @@ static void rt_queue_pull_to_group(struct rt_rq *rt_rq)
struct rq *global_rq = cpu_rq(rq->cpu);
struct sched_dl_entity *dl_se = dl_group_of(rt_rq);

+ BUG_ON(rt_rq == NULL);
+ BUG_ON(!is_dl_group(rt_rq));
+ BUG_ON(rq == global_rq);
+
if (dl_se->dl_throttled || global_rq->rq_to_pull_to)
return;

@@ -1408,6 +1415,8 @@ static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq)
*/
static int push_rt_task(struct rq *rq, bool pull)
{
+ BUG_ON(is_dl_group(&rq->rt));
+
struct task_struct *next_task;
struct rq *lowest_rq;
int ret = 0;
@@ -1709,6 +1718,8 @@ void rto_push_irq_work_func(struct irq_work *work)

static void pull_rt_task(struct rq *this_rq)
{
+ BUG_ON(is_dl_group(&this_rq->rt));
+
int this_cpu = this_rq->cpu, cpu;
bool resched = false;
struct task_struct *p, *push_task;
@@ -1833,6 +1844,8 @@ static int group_find_lowest_rt_rq(struct task_struct *task, struct rt_rq *task_
int prio, lowest_prio;
int cpu, this_cpu = smp_processor_id();

+ BUG_ON(task->sched_task_group != task_rt_rq->tg);
+
if (task->nr_cpus_allowed == 1)
return -1; /* No other targets possible */

@@ -1931,6 +1944,8 @@ static struct rt_rq *group_find_lock_lowest_rt_rq(struct task_struct *task, stru
struct sched_dl_entity *lowest_dl_se;
int tries, cpu;

+ BUG_ON(task->sched_task_group != rt_rq->tg);
+
for (tries = 0; tries < RT_MAX_TRIES; tries++) {
cpu = group_find_lowest_rt_rq(task, rt_rq);

@@ -1984,6 +1999,8 @@ static struct rt_rq *group_find_lock_lowest_rt_rq(struct task_struct *task, stru

static int group_push_rt_task(struct rt_rq *rt_rq, bool pull)
{
+ BUG_ON(!is_dl_group(rt_rq));
+
struct rq *rq = rq_of_rt_rq(rt_rq);
struct task_struct *next_task;
struct rq *lowest_rq;
@@ -2103,6 +2120,8 @@ static int group_push_rt_task(struct rt_rq *rt_rq, bool pull)

static void group_pull_rt_task(struct rt_rq *this_rt_rq)
{
+ BUG_ON(!is_dl_group(this_rt_rq));
+
struct rq *this_rq = rq_of_rt_rq(this_rt_rq);
int this_cpu = this_rq->cpu, cpu;
bool resched = false;
@@ -2215,6 +2234,9 @@ static void group_push_rt_tasks_callback(struct rq *global_rq)
{
struct rt_rq *rt_rq = &global_rq->rq_to_push_from->rt;

+ BUG_ON(global_rq->rq_to_push_from == NULL);
+ BUG_ON(served_rq_of_rt_rq(rt_rq) == global_rq);
+
if ((rt_rq->rt_nr_running > 1) ||
(dl_group_of(rt_rq)->dl_throttled == 1)) {

@@ -2228,6 +2250,9 @@ static void group_pull_rt_task_callback(struct rq *global_rq)
{
struct rt_rq *rt_rq = &global_rq->rq_to_pull_to->rt;

+ BUG_ON(global_rq->rq_to_pull_to == NULL);
+ BUG_ON(served_rq_of_rt_rq(rt_rq) == global_rq);
+
group_pull_rt_task(rt_rq);
global_rq->rq_to_pull_to = NULL;
}
--
2.53.0