Introduce system_state variable.

Use it to replace x86-specific early_boot boolean variable.

Also use it to detect suspend/resume case during cpu offline/online
to avoid unnecessarily breaking vcpu and cpupool affinities.

Signed-off-by: Keir Fraser <keir@xen.org>
Acked-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
This commit is contained in:
Keir Fraser committed 2012-03-22 12:20:13 +00:00
1 parent 8aed7f047d
commit 269f543ea7
11 files changed
+35 -9

No files matched your search

+2
View File
@@ -253,6 +253,8 @@ void __init start_xen(unsigned long boot_phys_offset,
/* Hide UART from DOM0 if we're using it */
serial_endboot();
system_state = SYS_STATE_active;
domain_unpause_by_systemcontroller(dom0);
/* Switch on to the dynamically allocated stack for the idle vcpu
+10
View File
@@ -135,6 +135,9 @@ static int enter_state(u32 state)
if ( !spin_trylock(&pm_lock) )
return -EBUSY;
BUG_ON(system_state != SYS_STATE_active);
system_state = SYS_STATE_suspend;
printk(XENLOG_INFO "Preparing system for ACPI S%d state.\n", state);
freeze_domains();
@@ -142,7 +145,10 @@ static int enter_state(u32 state)
acpi_dmar_reinstate();
if ( (error = disable_nonboot_cpus()) )
{
system_state = SYS_STATE_resume;
goto enable_cpu;
}
cpufreq_del_cpu(0);
@@ -159,6 +165,7 @@ static int enter_state(u32 state)
if ( (error = device_power_down()) )
{
printk(XENLOG_ERR "Some devices failed to power down.");
system_state = SYS_STATE_resume;
goto done;
}
@@ -179,6 +186,8 @@ static int enter_state(u32 state)
break;
}
system_state = SYS_STATE_resume;
/* Restore CR4 and EFER from cached values. */
cr4 = read_cr4();
write_cr4(cr4 & ~X86_CR4_MCE);
@@ -212,6 +221,7 @@ static int enter_state(u32 state)
mtrr_aps_sync_end();
acpi_dmar_zap();
thaw_domains();
system_state = SYS_STATE_active;
spin_unlock(&pm_lock);
return error;
}
+1 -1
View File
@@ -5316,7 +5316,7 @@ int ptwr_do_page_fault(struct vcpu *v, unsigned long addr,
void free_xen_pagetable(void *v)
{
if ( early_boot )
if ( system_state == SYS_STATE_early_boot )
return;
if ( is_xen_heap_page(virt_to_page(v)) )
+4 -4
View File
@@ -81,8 +81,6 @@ boolean_param("noapic", skip_ioapic_setup);
s8 __read_mostly xen_cpuidle = -1;
boolean_param("cpuidle", xen_cpuidle);
bool_t __read_mostly early_boot = 1;
cpumask_t __read_mostly cpu_present_map;
unsigned long __read_mostly xen_phys_start;
@@ -271,7 +269,7 @@ static void *__init bootstrap_map(const module_t *mod)
void *ret;
#ifdef __x86_64__
if ( !early_boot )
if ( system_state != SYS_STATE_early_boot )
return mod ? mfn_to_virt(mod->mod_start) : NULL;
#endif
@@ -1168,7 +1166,7 @@ void __init __start_xen(unsigned long mbi_p)
#endif
end_boot_allocator();
early_boot = 0;
system_state = SYS_STATE_boot;
#if defined(CONFIG_X86_64)
vesa_init();
@@ -1391,6 +1389,8 @@ void __init __start_xen(unsigned long mbi_p)
dmi_end_boot();
system_state = SYS_STATE_active;
domain_unpause_by_systemcontroller(dom0);
reset_stack_and_jump(init_done);
+1 -1
View File
@@ -43,7 +43,7 @@ void *alloc_xen_pagetable(void)
{
unsigned long mfn;
if ( !early_boot )
if ( system_state != SYS_STATE_early_boot )
{
void *v = alloc_xenheap_page();
+1 -1
View File
@@ -85,7 +85,7 @@ void *alloc_xen_pagetable(void)
{
unsigned long mfn;
if ( !early_boot )
if ( system_state != SYS_STATE_early_boot )
{
struct page_info *pg = alloc_domheap_page(NULL, 0);
+5
View File
@@ -629,6 +629,10 @@ static int cpu_callback(
unsigned int cpu = (unsigned long)hcpu;
int rc = 0;
if ( (system_state == SYS_STATE_suspend) ||
(system_state == SYS_STATE_resume) )
goto out;
switch ( action )
{
case CPU_DOWN_FAILED:
@@ -642,6 +646,7 @@ static int cpu_callback(
break;
}
out:
return !rc ? NOTIFY_DONE : notifier_from_errno(rc);
}
+2
View File
@@ -20,6 +20,8 @@
#ifndef COMPAT
enum system_state system_state = SYS_STATE_early_boot;
int tainted;
xen_commandline_t saved_cmdline;
+1 -1
View File
@@ -538,7 +538,7 @@ int cpu_disable_scheduler(unsigned int cpu)
int ret = 0;
c = per_cpu(cpupool, cpu);
if ( c == NULL )
if ( (c == NULL) || (system_state == SYS_STATE_suspend) )
return ret;
for_each_domain_in_cpupool ( d, c )
-1
View File
@@ -3,7 +3,6 @@
#include <xen/multiboot.h>
extern bool_t early_boot;
extern unsigned long xenheap_initial_phys_start;
void early_cpu_init(void);
+8
View File
@@ -87,5 +87,13 @@ extern char _sinittext[], _einittext[];
(__p >= _sinittext) && (__p < _einittext); \
})
extern enum system_state {
SYS_STATE_early_boot,
SYS_STATE_boot,
SYS_STATE_active,
SYS_STATE_suspend,
SYS_STATE_resume
} system_state;
#endif /* _LINUX_KERNEL_H */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.