Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Maintenance:4497
xen.openSUSE_13.2_Update
56546ab2-sched-fix-insert_vcpu-locking.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 56546ab2-sched-fix-insert_vcpu-locking.patch of Package xen.openSUSE_13.2_Update
# Commit ae2f41e3d7e7798537b7ea6dbb9a0c6aeb1179e3 # Date 2015-11-24 14:48:34 +0100 # Author Dario Faggioli <dario.faggioli@citrix.com> # Committer Jan Beulich <jbeulich@suse.com> sched: fix locking for insert_vcpu() in credit1 and RTDS The insert_vcpu() hook is handled with inconsistent locking. In fact, schedule_cpu_switch() calls the hook with runqueue lock held, while sched_move_domain() relies on the hook implementations to take the lock themselves (and, since that is not done in Credit1 and RTDS, such operation is not safe in those cases). This is fixed as follows: - take the lock in the hook implementations, in specific schedulers' code; - avoid calling insert_vcpu(), for the idle vCPU, in schedule_cpu_switch(). In fact, idle vCPUs are set to run immediately, and the various schedulers won't insert them in their runqueues anyway, even when explicitly asked to. While there, still in schedule_cpu_switch(), locking with _irq() is enough (there's no need to do *_irqsave()). Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com> Reviewed-by: Meng Xu <mengxu@cis.upenn.edu> Reviewed-by: George Dunlap <george.dunlap@citrix.com> --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -910,9 +910,15 @@ static void csched_vcpu_insert(const struct scheduler *ops, struct vcpu *vc) { struct csched_vcpu *svc = vc->sched_priv; + spinlock_t *lock; + unsigned long flags; + + lock = vcpu_schedule_lock_irqsave(vc, &flags); if ( !__vcpu_on_runq(svc) && vcpu_runnable(vc) && !vc->is_running ) __runq_insert(vc->processor, svc); + + vcpu_schedule_unlock_irqrestore(lock, flags, vc); } static void --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -1418,7 +1418,6 @@ void __init scheduler_init(void) int schedule_cpu_switch(unsigned int cpu, struct cpupool *c) { - unsigned long flags; struct vcpu *idle; spinlock_t *lock; void *ppriv, *ppriv_old, *vpriv, *vpriv_old; @@ -1439,7 +1438,7 @@ int schedule_cpu_switch(unsigned int cpu return -ENOMEM; } - lock = pcpu_schedule_lock_irqsave(cpu, &flags); + lock = pcpu_schedule_lock_irq(cpu); SCHED_OP(old_ops, tick_suspend, cpu); vpriv_old = idle->sched_priv; @@ -1448,9 +1447,8 @@ int schedule_cpu_switch(unsigned int cpu ppriv_old = per_cpu(schedule_data, cpu).sched_priv; per_cpu(schedule_data, cpu).sched_priv = ppriv; SCHED_OP(new_ops, tick_resume, cpu); - SCHED_OP(new_ops, insert_vcpu, idle); - pcpu_schedule_unlock_irqrestore(lock, flags, cpu); + pcpu_schedule_unlock_irq(lock, cpu); SCHED_OP(old_ops, free_vdata, vpriv_old); SCHED_OP(old_ops, free_pdata, ppriv_old, cpu);
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