When resuming from S3 and smt=0 or maxcpus= are specified we must not
do anything in cpu_schedule_callback(). This is not true today for
taking down a cpu during resume.
If anything goes wrong during resume all the scheduler related error
handling is in cpupool.c, so we can just bail out early from
cpu_schedule_callback() when suspending or resuming.
This fixes commit
0763cd2687897b55e7 ("xen/sched: don't disable
scheduler on cpus during suspend").
Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Tested-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: George Dunlap <george.dunlap@citrix.com>
unsigned int cpu = (unsigned long)hcpu;
int rc = 0;
+ /*
+ * All scheduler related suspend/resume handling needed is done in
+ * cpupool.c.
+ */
+ if ( system_state > SYS_STATE_active )
+ return NOTIFY_DONE;
+
rcu_read_lock(&sched_res_rculock);
/*
switch ( action )
{
case CPU_UP_PREPARE:
- if ( system_state != SYS_STATE_resume )
- rc = cpu_schedule_up(cpu);
+ rc = cpu_schedule_up(cpu);
break;
case CPU_DOWN_PREPARE:
rcu_read_lock(&domlist_read_lock);
rcu_read_unlock(&domlist_read_lock);
break;
case CPU_DEAD:
- if ( system_state == SYS_STATE_suspend )
- break;
sched_rm_cpu(cpu);
break;
case CPU_UP_CANCELED:
- if ( system_state != SYS_STATE_resume )
- cpu_schedule_down(cpu);
+ cpu_schedule_down(cpu);
break;
default:
break;