aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2012-11-01 18:17:35 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2012-11-01 18:17:35 -0400
commitad1ae84b5b37b1ebe1ddef7149f58072046311c6 (patch)
tree187937225de0c53f9c9f5601361c1bf31401646c
parentd70a4b81122eb701ee6595ed843ad9137f057441 (diff)
Fixed race condition in preemption code.
-rw-r--r--litmus/sched_mc.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/litmus/sched_mc.c b/litmus/sched_mc.c
index f24c89341629..55d604fa07cc 100644
--- a/litmus/sched_mc.c
+++ b/litmus/sched_mc.c
@@ -1287,7 +1287,16 @@ static void process_signals(struct cpu_entry *entry)
1287 if (ce->server.state == SS_ACTIVE && 1287 if (ce->server.state == SS_ACTIVE &&
1288 mc_preempt_needed(ce->domain, ce->server.linked)) { 1288 mc_preempt_needed(ce->domain, ce->server.linked)) {
1289 preempted = preempt_crit(ce->domain, ce); 1289 preempted = preempt_crit(ce->domain, ce);
1290 raw_spin_unlock(&entry->lock); 1290
1291 /* Can't requeue while we hold the entry lock, but
1292 * can't release that lock until state of lower-crit
1293 * servers is updated
1294 */
1295 if (!is_ghost(ce->server.linked)) {
1296 update_crit_levels(entry);
1297 } else {
1298 raw_spin_unlock(&entry->lock);
1299 }
1291 1300
1292 if (preempted) { 1301 if (preempted) {
1293 dom->requeue(dom, preempted); 1302 dom->requeue(dom, preempted);
@@ -1295,10 +1304,6 @@ static void process_signals(struct cpu_entry *entry)
1295 1304
1296 raw_spin_unlock(dom->lock); 1305 raw_spin_unlock(dom->lock);
1297 raw_spin_lock(&entry->lock); 1306 raw_spin_lock(&entry->lock);
1298 if (!is_ghost(ce->server.linked)) {
1299 update_crit_levels(entry);
1300 raw_spin_lock(&entry->lock);
1301 }
1302 } else { 1307 } else {
1303 raw_spin_unlock(dom->lock); 1308 raw_spin_unlock(dom->lock);
1304 } 1309 }