xen/sched: rtds: assert replq is empty on timer (re-)init

In RTDS, removing the last eligible pCPU kills repl_timer. When a pCPU
is later re-added, rt_switch_sched() reinitializes the timer object.

cpupool_unassign_cpu_start() refuses to remove the last pCPU from a
populated cpupool: if any domain is still alive while the system is
active it returns -EBUSY, otherwise all domains are first moved to
cpupool0. Consequently, by the time the killed-timer branch runs, no
units remain in the pool and replq is guaranteed to be empty.

Document this invariant by asserting list_empty(replq) right after
init_timer(). This catches any future regression in cpupool semantics
that would leave pending replenishment events behind across a
TIMER_STATUS_killed -> init_timer() transition, where the timer would
otherwise stay disarmed until an unrelated event reprogrammed it.

Signed-off-by: Oleksii Moisieiev <oleksii_moisieiev@epam.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Oleksii Moisieiev authored and Jan Beulich committed 2026-05-22 08:14:48 +02:00
1 parent 410d44fcf3
commit 8969e435d4
1 file changed
+8
+8
View File
@@ -749,6 +749,14 @@ rt_switch_sched(struct scheduler *new_ops, unsigned int cpu,
{
init_timer(&prv->repl_timer, repl_timer_handler, (void *)new_ops, cpu);
dprintk(XENLOG_DEBUG, "RTDS: timer initialized on cpu %u\n", cpu);
/*
* cpupool_unassign_cpu_start() refuses to remove the last pCPU from
* a populated cpupool, so by the time this path runs (timer was
* killed because all RTDS pCPUs were removed) the pool must have
* been empty of domains, which implies replq is empty too.
*/
ASSERT(list_empty(rt_replq(new_ops)));
}
sched_idle_unit(cpu)->priv = vdata;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.