diff options
author | Juergen Gross <juergen.gross@ts.fujitsu.com> | 2011-09-17 16:19:26 +0100 |
---|---|---|
committer | Juergen Gross <juergen.gross@ts.fujitsu.com> | 2011-09-17 16:19:26 +0100 |
commit | 4dd27c01c31c55319758b47dccdba46ddd5f499e (patch) | |
tree | 4f71b6aa341d15c33405f7121215a0a7a98d1572 /xen/common/schedule.c | |
parent | 2c36185d4407f6932ecf3e8d5244049c816a8f91 (diff) | |
download | xen-4dd27c01c31c55319758b47dccdba46ddd5f499e.tar.gz xen-4dd27c01c31c55319758b47dccdba46ddd5f499e.tar.bz2 xen-4dd27c01c31c55319758b47dccdba46ddd5f499e.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>
Diffstat (limited to 'xen/common/schedule.c')
-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 cce22a5795..0f6d41ee96 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -1107,7 +1107,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; @@ -1141,6 +1141,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; |