Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.6:Update
xen.19910
credit2-avoid-picking-a-spurious-idle-unit-when...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File credit2-avoid-picking-a-spurious-idle-unit-when-caps-are-used.patch of Package xen.19910
From 5167a7ccf3e221b62eff758e2ce55dd2924c71e1 Mon Sep 17 00:00:00 2001 From: Dario Faggioli <dfaggioli@suse.com> Date: Mon, 21 Jun 2021 18:25:34 +0200 Subject: [PATCH 2/2] Xen: credit2: avoid picking a spurious idle unit when caps are used Commit 07b0eb5d0ef0 ("credit2: make sure we pick a runnable unit from the runq if there is one") did not fix completely the problem of potentially selecting a scheduling unit that will then not be able to run. In fact, in case caps are used and the unit we are currently looking at, during the runqueue scan, does not have enough budget for being run, we should continue looking instead than giving up and picking the idle unit. Suggested-by: George Dunlap <george.dunlap@citrix.com> Signed-off-by: Dario Faggioli <dfaggioli@suse.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> --- xen/common/sched_credit2.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c index fab6ac7aff..9e13391916 100644 --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -3368,6 +3368,15 @@ runq_candidate(struct csched2_runqueue_data *rqd, (unsigned char *)&d); } + /* + * If the unit in the runqueue has more credits than current (or than + * idle, if current is not runnable) or if current is yielding, we may + * want to pick it up. Otherwise, there's no need to keep scanning the + * runqueue any further. + */ + if ( !yield && svc->credit <= snext->credit ) + break; + /* Skip non runnable units that we (temporarily) have in the runq */ if ( unlikely(!unit_runnable_state(svc->unit)) ) continue; @@ -3399,16 +3408,25 @@ runq_candidate(struct csched2_runqueue_data *rqd, } /* - * If the one in the runqueue has more credit than current (or idle, - * if current is not runnable), or if current is yielding, and also - * if the one in runqueue either is not capped, or is capped but has - * some budget, then choose it. + * If we are here, we are almost sure we want to pick the unit in + * the runqueue. Last thing we need to check is that it either is + * not capped or, if it is, it has some budget. + * + * Note that budget availability must be the very last check that we + * do, in this loop, due to the side effects that unit_grab_budget(). + * causes. + * + * In fact, if there is budget available in the unit's domain's + * budget pool, the function will pick some for running this unit. + * And we clearly want to do that only if we're otherwise sure that + * the unit will actually run, consume it, and return the leftover + * (if any) in the usual way. */ - if ( (yield || svc->credit > snext->credit) && - (!has_cap(svc) || unit_grab_budget(svc)) ) - snext = svc; + if ( has_cap(svc) && !unit_grab_budget(svc) ) + continue; /* In any case, if we got this far, break. */ + snext = svc; break; } -- 2.32.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor