]> xenbits.xensource.com Git - xen.git/commitdiff
xen: credit2: fix spinlock irq-safety violation
authorDario Faggioli <dario.faggioli@citrix.com>
Thu, 21 Sep 2017 00:30:37 +0000 (02:30 +0200)
committerGeorge Dunlap <george.dunlap@citrix.com>
Thu, 21 Sep 2017 10:29:41 +0000 (11:29 +0100)
In commit ad4b3e1e9df34 ("xen: credit2: implement
utilization cap") xfree() was being called (for
deallocating the budget replenishment timer, during
domain destruction) inside an IRQ disabled critical
section.

That must not happen, as it uses the mem-pool's lock,
which needs to be taken with IRQ enabled. And, in fact,
we crash (in debug builds):

(XEN) ****************************************
(XEN) Panic on CPU 0:
(XEN) Xen BUG at spinlock.c:47
(XEN) ****************************************

Let's, therefore, kill and deallocate the timer outside of
the critical sections, when IRQs are enabled.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
xen/common/sched_credit2.c

index 5b2cae184a93ed08244c72d43e1dcef0256847bb..ccd5c951b2ae9ec496ae08d9b627c6ed557f4a8a 100644 (file)
@@ -2921,15 +2921,15 @@ csched2_free_domdata(const struct scheduler *ops, void *data)
     struct csched2_dom *sdom = data;
     struct csched2_private *prv = csched2_priv(ops);
 
-    write_lock_irqsave(&prv->lock, flags);
-
     kill_timer(sdom->repl_timer);
-    xfree(sdom->repl_timer);
+
+    write_lock_irqsave(&prv->lock, flags);
 
     list_del_init(&sdom->sdom_elem);
 
     write_unlock_irqrestore(&prv->lock, flags);
 
+    xfree(sdom->repl_timer);
     xfree(data);
 }