]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
Avoid race in schedule() when switching schedulers
authorJuergen Gross <juergen.gross@ts.fujitsu.com>
Sat, 17 Sep 2011 15:35:21 +0000 (16:35 +0100)
committerJuergen Gross <juergen.gross@ts.fujitsu.com>
Sat, 17 Sep 2011 15:35:21 +0000 (16:35 +0100)
Selecting the scheduler to call must be done under lock. Otherwise a
race might occur when switching schedulers in a cpupool

Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
Acked-by: George Dunlap <george.dunlap@eu.citrix.com>
xen-unstable changeset:   23843:6684e3bafbbd
xen-unstable date:        Sat Sep 17 16:19:26 2011 +0100

xen/common/schedule.c

index 53a1353b47150e05ebe04681d0e797e4c194a8d4..bbeef8f6f5c01177ed1bac5b9de6b8e43bc8049c 100644 (file)
@@ -1112,7 +1112,7 @@ static void schedule(void)
 {
     struct vcpu          *prev = current, *next = NULL;
     s_time_t              now = NOW();
-    struct scheduler     *sched = this_cpu(scheduler);
+    struct scheduler     *sched;
     unsigned long        *tasklet_work = &this_cpu(tasklet_work_to_do);
     bool_t                tasklet_work_scheduled = 0;
     struct schedule_data *sd;
@@ -1146,6 +1146,7 @@ static void schedule(void)
     stop_timer(&sd->s_timer);
     
     /* get policy-specific decision on scheduling... */
+    sched = this_cpu(scheduler);
     next_slice = sched->do_schedule(sched, now, tasklet_work_scheduled);
 
     next = next_slice.task;