xen, credit2: Put the per-cpu schedule lock back to the default lock when releasing cpu
authorGeorge Dunlap <george.dunlap@eu.citrix.com>
Tue, 10 Apr 2012 09:41:55 +0000 (10:41 +0100)
committerGeorge Dunlap <george.dunlap@eu.citrix.com>
Tue, 10 Apr 2012 09:41:55 +0000 (10:41 +0100)
This fixes a bug that happens when you remove cpus from a credit2
cpupool.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
xen/common/sched_credit2.c

index 785303b2594be74183dff8faa000135a667aff6d..471f6d5b07acf82161124b8d35d523679f64abc4 100644 (file)
@@ -1952,6 +1952,7 @@ csched_free_pdata(const struct scheduler *ops, void *pcpu, int cpu)
     unsigned long flags;
     struct csched_private *prv = CSCHED_PRIV(ops);
     struct csched_runqueue_data *rqd;
+    struct schedule_data *sd = &per_cpu(schedule_data, cpu);
     int rqi;
 
     spin_lock_irqsave(&prv->lock, flags);
@@ -1979,6 +1980,11 @@ csched_free_pdata(const struct scheduler *ops, void *pcpu, int cpu)
         deactivate_runqueue(prv, rqi);
     }
 
+    /* Move spinlock to the original lock.  */
+    ASSERT(sd->schedule_lock == &rqd->lock);
+    ASSERT(!spin_is_locked(&sd->_lock));
+    sd->schedule_lock = &sd->_lock;
+
     spin_unlock(&rqd->lock);
 
     cpumask_clear_cpu(cpu, &prv->initialized);