Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.6:Update
xen.19910
60be0e24-credit2-pick-runnable-unit.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 60be0e24-credit2-pick-runnable-unit.patch of Package xen.19910
References: bsc#1179246 # Commit 07b0eb5d0ef0be154606aa46b5b4c5c59b158505 # Date 2021-06-07 13:16:36 +0100 # Author Dario Faggioli <dfaggioli@suse.com> # Committer George Dunlap <george.dunlap@citrix.com> credit2: make sure we pick a runnable unit from the runq if there is one A !runnable unit (temporarily) present in the runq may cause us to stop scanning the runq itself too early. Of course, we don't run any non-runnable vCPUs, but we end the scan and we fallback to picking the idle unit. In other word, this prevent us to find there and pick the actual unit that we're meant to start running (which might be further ahead in the runq). Depending on the vCPU pinning configuration, this may lead to such unit to be stuck in the runq for long time, causing malfunctioning inside the guest. Fix this by checking runnable/non-runnable status up-front, in the runq scanning function. Reported-by: Michał Leszczyński <michal.leszczynski@cert.pl> Reported-by: Dion Kant <g.w.kant@hunenet.nl> Signed-off-by: Dario Faggioli <dfaggioli@suse.com> Reviewed-by: George Dunlap <george.dunlap@citrix.com> --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -3368,6 +3368,10 @@ runq_candidate(struct csched2_runqueue_d (unsigned char *)&d); } + /* Skip non runnable units that we (temporarily) have in the runq */ + if ( unlikely(!unit_runnable_state(svc->unit)) ) + continue; + /* Only consider vcpus that are allowed to run on this processor. */ if ( !cpumask_test_cpu(cpu, svc->unit->cpu_hard_affinity) ) continue; @@ -3401,8 +3405,7 @@ runq_candidate(struct csched2_runqueue_d * some budget, then choose it. */ if ( (yield || svc->credit > snext->credit) && - (!has_cap(svc) || unit_grab_budget(svc)) && - unit_runnable_state(svc->unit) ) + (!has_cap(svc) || unit_grab_budget(svc)) ) snext = svc; /* In any case, if we got this far, break. */
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