diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-11-01 18:17:35 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-11-01 18:17:35 -0400 |
commit | ad1ae84b5b37b1ebe1ddef7149f58072046311c6 (patch) | |
tree | 187937225de0c53f9c9f5601361c1bf31401646c | |
parent | d70a4b81122eb701ee6595ed843ad9137f057441 (diff) |
Fixed race condition in preemption code.
-rw-r--r-- | litmus/sched_mc.c | 15 |
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 | } |