aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/schedule.c
diff options
context:
space:
mode:
authorJuergen Gross <juergen.gross@ts.fujitsu.com>2011-09-17 16:19:26 +0100
committerJuergen Gross <juergen.gross@ts.fujitsu.com>2011-09-17 16:19:26 +0100
commit4dd27c01c31c55319758b47dccdba46ddd5f499e (patch)
tree4f71b6aa341d15c33405f7121215a0a7a98d1572 /xen/common/schedule.c
parent2c36185d4407f6932ecf3e8d5244049c816a8f91 (diff)
downloadxen-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.c3
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;