diff options
author | Juergen Gross <juergen.gross@ts.fujitsu.com> | 2011-09-17 16:35:21 +0100 |
---|---|---|
committer | Juergen Gross <juergen.gross@ts.fujitsu.com> | 2011-09-17 16:35:21 +0100 |
commit | 0f95c3842c4034b1e29f652c1c18a5d2831bd475 (patch) | |
tree | 784f1fad79b4568d0dbe05df5e3f5e291c0a00fb | |
parent | 3233d7686ff2d6d585dd1517696f322ce87cb578 (diff) | |
download | xen-0f95c3842c4034b1e29f652c1c18a5d2831bd475.tar.gz xen-0f95c3842c4034b1e29f652c1c18a5d2831bd475.tar.bz2 xen-0f95c3842c4034b1e29f652c1c18a5d2831bd475.zip |
Avoid race in schedule() when switching schedulers
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
-rw-r--r-- | xen/common/schedule.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 53a1353b47..bbeef8f6f5 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -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; |