From 897cc6d07acd3e66356f021c5f7f9a49ef061d5d Mon Sep 17 00:00:00 2001 From: Dario Faggioli Date: Fri, 6 Nov 2015 15:16:38 +0100 Subject: [PATCH] sched: fix locking of remove_vcpu() in credit1 In fact, csched_vcpu_remove() (i.e., the credit1 implementation of remove_vcpu()) manipulates runqueues, so holding the runqueue lock is necessary. However, the vCPU just can't be on the runqueue, when the function is called. We can therefore ASSERT() that, and avoid doing any runqueue manipulations (rather than adding the runqueue locking around it). Also, while there, *_lock_irq() (for the private lock) is enough, there is no need to *_lock_irqsave(). Signed-off-by: Dario Faggioli Reviewed-by: George Dunlap --- xen/common/sched_credit.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c index 9eb457c65a..72a210911a 100644 --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -933,28 +933,25 @@ csched_vcpu_remove(const struct scheduler *ops, struct vcpu *vc) struct csched_private *prv = CSCHED_PRIV(ops); struct csched_vcpu * const svc = CSCHED_VCPU(vc); struct csched_dom * const sdom = svc->sdom; - unsigned long flags; SCHED_STAT_CRANK(vcpu_remove); + ASSERT(!__vcpu_on_runq(svc)); + if ( test_and_clear_bit(CSCHED_FLAG_VCPU_PARKED, &svc->flags) ) { SCHED_STAT_CRANK(vcpu_unpark); vcpu_unpause(svc->vcpu); } - if ( __vcpu_on_runq(svc) ) - __runq_remove(svc); - - spin_lock_irqsave(&(prv->lock), flags); + spin_lock_irq(&prv->lock); if ( !list_empty(&svc->active_vcpu_elem) ) __csched_vcpu_acct_stop_locked(prv, svc); - spin_unlock_irqrestore(&(prv->lock), flags); + spin_unlock_irq(&prv->lock); BUG_ON( sdom == NULL ); - BUG_ON( !list_empty(&svc->runq_elem) ); } static void -- 2.39.5