xen/sched: rtds: prevent extratime priority_level wraparound

In RTDS, burn_budget() increments priority_level for extratime units
whenever cur_budget is exhausted. As priority_level is unsigned and was
unbounded, it could eventually overflow to 0.

A wrapped value of 0 is the highest RTDS priority, so an extratime unit
could unexpectedly regain top priority and preempt units with active
real-time reservations, violating EDF intent.

Fix this by saturating priority_level at RTDS_MAX_PRIORITY_LEVEL instead
of incrementing unconditionally. Budget refill semantics are unchanged.

Normal behavior is unchanged. Once saturated, priority_level remains at
the lowest priority until the next period update resets it.

Fixes: 463b958317 (xen:rtds: towards work conserving RTDS)
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:13:59 +02:00
1 parent 86a203ab8d
commit 410d44fcf3
1 file changed
+9 -1
+9 -1
View File
@@ -110,6 +110,12 @@
*/
#define RTDS_MIN_BUDGET (MICROSECS(10))
/*
* Maximum extratime demotion level. Saturating at this value avoids
* unsigned wraparound back to 0 (highest scheduling priority).
*/
#define RTDS_MAX_PRIORITY_LEVEL (~0U)
/*
* UPDATE_LIMIT_SHIFT: a constant used in rt_update_deadline(). When finding
* the next deadline, performing addition could be faster if the difference
@@ -976,7 +982,9 @@ burn_budget(const struct scheduler *ops, struct rt_unit *svc, s_time_t now)
{
if ( has_extratime(svc) )
{
svc->priority_level++;
if ( svc->priority_level < RTDS_MAX_PRIORITY_LEVEL )
svc->priority_level++;
svc->cur_budget = svc->budget;
}
else
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.