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>
xen-unstable changeset:   25162:478bec603d3d
xen-unstable date:        Tue Apr 10 10:41:30 2012 +0100
This commit is contained in:
George Dunlap committed 2012-07-09 10:24:44 +01:00
1 parent c279f333a7
commit 4e8f99fc6e
1 file changed
+4 -3
+4 -3
View File
@@ -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);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.