[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-4.1-testing] xen: Fix schedule()'s grabbing of the schedule lock
# HG changeset patch # User George Dunlap <george.dunlap@xxxxxxxxxxxxx> # Date 1341825884 -3600 # Node ID c1f43d07dc1ed4203afe4f0a207da04213c53e3e # Parent 01366a3245870bed6666f98d498528697d082701 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@xxxxxxxxxxxxx> Committed-by: Keir Fraser <keir@xxxxxxx> xen-unstable changeset: 25162:478bec603d3d xen-unstable date: Tue Apr 10 10:41:30 2012 +0100 --- diff -r 01366a324587 -r c1f43d07dc1e xen/common/schedule.c --- a/xen/common/schedule.c Mon Jul 09 10:23:57 2012 +0100 +++ b/xen/common/schedule.c Mon Jul 09 10:24:44 2012 +0100 @@ -1122,6 +1122,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()); @@ -1146,7 +1147,7 @@ static void schedule(void) BUG(); } - spin_lock_irq(sd->schedule_lock); + pcpu_schedule_lock_irq(cpu); stop_timer(&sd->s_timer); @@ -1163,7 +1164,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); } @@ -1201,7 +1202,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); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |