diff options
author | George Dunlap <george.dunlap@eu.citrix.com> | 2012-04-10 10:41:30 +0100 |
---|---|---|
committer | George Dunlap <george.dunlap@eu.citrix.com> | 2012-04-10 10:41:30 +0100 |
commit | 4cee6a3812e9e81532f89b5be15d549faf49fffd (patch) | |
tree | 8dcafc4c215aba1c69962ce92b3726ad981c1c02 /xen/common/schedule.c | |
parent | 1f348a695fa0a22ee1e99c8972181de859ec3d87 (diff) | |
download | xen-4cee6a3812e9e81532f89b5be15d549faf49fffd.tar.gz xen-4cee6a3812e9e81532f89b5be15d549faf49fffd.tar.bz2 xen-4cee6a3812e9e81532f89b5be15d549faf49fffd.zip |
xen: Fix schedule()'s grabbing of the schedule lock
Because the location of the lock can change between the time you read
it and the time you grab it, the per-cpu schedule locks need to check
after lock acquisition that the lock location hasn't changed, and
release and re-try if so. This change was effected throughout the
source code, but one very important place was apparently missed: in
schedule() itself.
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/common/schedule.c')
-rw-r--r-- | xen/common/schedule.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/xen/common/schedule.c b/xen/common/schedule.c index a1eeac36eb..724e8fa1ab 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -1075,6 +1075,7 @@ static void schedule(void) bool_t tasklet_work_scheduled = 0; struct schedule_data *sd; struct task_slice next_slice; + int cpu = smp_processor_id(); ASSERT(!in_atomic()); @@ -1099,7 +1100,7 @@ static void schedule(void) BUG(); } - spin_lock_irq(sd->schedule_lock); + pcpu_schedule_lock_irq(cpu); stop_timer(&sd->s_timer); @@ -1116,7 +1117,7 @@ static void schedule(void) if ( unlikely(prev == next) ) { - spin_unlock_irq(sd->schedule_lock); + pcpu_schedule_unlock_irq(cpu); trace_continue_running(next); return continue_running(prev); } @@ -1154,7 +1155,7 @@ static void schedule(void) ASSERT(!next->is_running); next->is_running = 1; - spin_unlock_irq(sd->schedule_lock); + pcpu_schedule_unlock_irq(cpu); perfc_incr(sched_ctx); |