From 50b5df7dccd052b685084abe31a4b6be43c976ae Mon Sep 17 00:00:00 2001 From: Chong Li Date: Tue, 5 Apr 2016 13:25:44 +0200 Subject: [PATCH] sched: fix deadlock when changing scheduling parameters Commit f7b87b0745b4 ("enable per-VCPU parameter for RTDS") introduced a bug: it made it possible, in Credit and Credit2, when doing domain or vcpu parameters' manipulation, to leave the hypervisor with a spinlock held and interrupts disabled. Fix it. Signed-off-by: Chong Li Acked-by: Dario Faggioli --- xen/common/sched_credit.c | 6 ++++-- xen/common/sched_credit2.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c index e5d15d8525..4c4927fac4 100644 --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -1075,6 +1075,7 @@ csched_dom_cntl( struct csched_dom * const sdom = CSCHED_DOM(d); struct csched_private *prv = CSCHED_PRIV(ops); unsigned long flags; + int rc = 0; /* Protect both get and put branches with the pluggable scheduler * lock. Runq lock not needed anywhere in here. */ @@ -1101,12 +1102,13 @@ csched_dom_cntl( sdom->cap = op->u.credit.cap; break; default: - return -EINVAL; + rc = -EINVAL; + break; } spin_unlock_irqrestore(&prv->lock, flags); - return 0; + return rc; } static inline void diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c index d48ed5a3d3..b8c8e40fc9 100644 --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -1416,6 +1416,7 @@ csched2_dom_cntl( struct csched2_dom * const sdom = CSCHED2_DOM(d); struct csched2_private *prv = CSCHED2_PRIV(ops); unsigned long flags; + int rc = 0; /* Must hold csched2_priv lock to read and update sdom, * runq lock to update csvcs. */ @@ -1457,12 +1458,13 @@ csched2_dom_cntl( } break; default: - return -EINVAL; + rc = -EINVAL; + break; } spin_unlock_irqrestore(&prv->lock, flags); - return 0; + return rc; } static void * -- 2.30.2