mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
86a203ab8d
commit
410d44fcf3
1 file changed
+9
-1
@@ -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
|
||||
|
||||