From: Chong Li Date: Tue, 5 Apr 2016 11:25:44 +0000 (+0200) Subject: sched: fix deadlock when changing scheduling parameters X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~1385 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=50b5df7dccd052b685084abe31a4b6be43c976ae;p=xen.git 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 --- 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 *