[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Merge.
# HG changeset patch # User Steven Smith <ssmith@xxxxxxxxxxxxx> # Node ID 15b5cc51db30383648375c3517879b7b623c34ca # Parent 159af40a1b37531b3d90b605f55341c1983b6edd # Parent e0942ef72b8e36d1796e6c82b25d04533271238e Merge. --- linux-2.6-xen-sparse/drivers/xen/core/Makefile | 2 linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c | 202 ++++++++++++++ linux-2.6-xen-sparse/drivers/xen/core/reboot.c | 231 +---------------- linux-2.6-xen-sparse/drivers/xen/netback/interface.c | 3 linux-2.6-xen-sparse/include/xen/reboot.h | 19 + tools/python/xen/xend/image.py | 35 ++ unmodified_drivers/linux-2.6/Makefile | 1 unmodified_drivers/linux-2.6/mkbuildtree | 1 unmodified_drivers/linux-2.6/util/Kbuild | 3 xen/common/sched_credit.c | 94 +++--- 10 files changed, 328 insertions(+), 263 deletions(-) diff -r 159af40a1b37 -r 15b5cc51db30 linux-2.6-xen-sparse/drivers/xen/core/Makefile --- a/linux-2.6-xen-sparse/drivers/xen/core/Makefile Tue Oct 31 11:44:28 2006 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/core/Makefile Tue Oct 31 11:44:47 2006 +0000 @@ -9,5 +9,5 @@ obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o obj-$(CONFIG_XEN_SYSFS) += xen_sysfs.o obj-$(CONFIG_XEN_SKBUFF) += skbuff.o -obj-$(CONFIG_XEN_REBOOT) += reboot.o +obj-$(CONFIG_XEN_REBOOT) += reboot.o machine_reboot.o obj-$(CONFIG_XEN_SMPBOOT) += smpboot.o diff -r 159af40a1b37 -r 15b5cc51db30 linux-2.6-xen-sparse/drivers/xen/core/reboot.c --- a/linux-2.6-xen-sparse/drivers/xen/core/reboot.c Tue Oct 31 11:44:28 2006 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/core/reboot.c Tue Oct 31 11:44:47 2006 +0000 @@ -1,215 +1,19 @@ #define __KERNEL_SYSCALLS__ #include <linux/version.h> #include <linux/kernel.h> -#include <linux/mm.h> #include <linux/unistd.h> #include <linux/module.h> #include <linux/reboot.h> #include <linux/sysrq.h> -#include <linux/stringify.h> -#include <asm/irq.h> -#include <asm/mmu_context.h> -#include <xen/evtchn.h> #include <asm/hypervisor.h> -#include <xen/interface/dom0_ops.h> #include <xen/xenbus.h> -#include <linux/cpu.h> #include <linux/kthread.h> -#include <xen/gnttab.h> -#include <xen/xencons.h> -#include <xen/cpu_hotplug.h> +#include <xen/reboot.h> -extern void ctrl_alt_del(void); +MODULE_LICENSE("Dual BSD/GPL"); -#define SHUTDOWN_INVALID -1 -#define SHUTDOWN_POWEROFF 0 -#define SHUTDOWN_SUSPEND 2 -/* Code 3 is SHUTDOWN_CRASH, which we don't use because the domain can only - * report a crash, not be instructed to crash! - * HALT is the same as POWEROFF, as far as we're concerned. The tools use - * the distinction when we return the reason code to them. - */ -#define SHUTDOWN_HALT 4 - -#if defined(__i386__) || defined(__x86_64__) - -/* - * Power off function, if any - */ -void (*pm_power_off)(void); -EXPORT_SYMBOL(pm_power_off); - -void machine_emergency_restart(void) -{ - /* We really want to get pending console data out before we die. */ - xencons_force_flush(); - HYPERVISOR_shutdown(SHUTDOWN_reboot); -} - -void machine_restart(char * __unused) -{ - machine_emergency_restart(); -} - -void machine_halt(void) -{ - machine_power_off(); -} - -void machine_power_off(void) -{ - /* We really want to get pending console data out before we die. */ - xencons_force_flush(); - if (pm_power_off) - pm_power_off(); - HYPERVISOR_shutdown(SHUTDOWN_poweroff); -} - -int reboot_thru_bios = 0; /* for dmi_scan.c */ -EXPORT_SYMBOL(machine_restart); -EXPORT_SYMBOL(machine_halt); -EXPORT_SYMBOL(machine_power_off); - -#endif /* defined(__i386__) || defined(__x86_64__) */ - -/****************************************************************************** - * Stop/pickle callback handling. - */ - -/* Ignore multiple shutdown requests. */ -static int shutting_down = SHUTDOWN_INVALID; static void __shutdown_handler(void *unused); static DECLARE_WORK(shutdown_work, __shutdown_handler, NULL); - -#if defined(__i386__) || defined(__x86_64__) - -/* Ensure we run on the idle task page tables so that we will - switch page tables before running user space. This is needed - on architectures with separate kernel and user page tables - because the user page table pointer is not saved/restored. */ -static void switch_idle_mm(void) -{ - struct mm_struct *mm = current->active_mm; - - if (mm == &init_mm) - return; - - atomic_inc(&init_mm.mm_count); - switch_mm(mm, &init_mm, current); - current->active_mm = &init_mm; - mmdrop(mm); -} - -static void pre_suspend(void) -{ - HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; - clear_fixmap(FIX_SHARED_INFO); - - xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn); - xen_start_info->console.domU.mfn = - mfn_to_pfn(xen_start_info->console.domU.mfn); -} - -static void post_suspend(void) -{ - int i, j, k, fpp; - extern unsigned long max_pfn; - extern unsigned long *pfn_to_mfn_frame_list_list; - extern unsigned long *pfn_to_mfn_frame_list[]; - - set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info); - - HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO); - - memset(empty_zero_page, 0, PAGE_SIZE); - - HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = - virt_to_mfn(pfn_to_mfn_frame_list_list); - - fpp = PAGE_SIZE/sizeof(unsigned long); - for (i = 0, j = 0, k = -1; i < max_pfn; i += fpp, j++) { - if ((j % fpp) == 0) { - k++; - pfn_to_mfn_frame_list_list[k] = - virt_to_mfn(pfn_to_mfn_frame_list[k]); - j = 0; - } - pfn_to_mfn_frame_list[k][j] = - virt_to_mfn(&phys_to_machine_mapping[i]); - } - HYPERVISOR_shared_info->arch.max_pfn = max_pfn; -} - -#else /* !(defined(__i386__) || defined(__x86_64__)) */ - -#define switch_idle_mm() ((void)0) -#define mm_pin_all() ((void)0) -#define pre_suspend() ((void)0) -#define post_suspend() ((void)0) - -#endif - -static int __do_suspend(void *ignore) -{ - int err; - - extern void time_resume(void); - - BUG_ON(smp_processor_id() != 0); - BUG_ON(in_interrupt()); - -#if defined(__i386__) || defined(__x86_64__) - if (xen_feature(XENFEAT_auto_translated_physmap)) { - printk(KERN_WARNING "Cannot suspend in " - "auto_translated_physmap mode.\n"); - return -EOPNOTSUPP; - } -#endif - - err = smp_suspend(); - if (err) - return err; - - xenbus_suspend(); - - preempt_disable(); - - mm_pin_all(); - local_irq_disable(); - preempt_enable(); - - gnttab_suspend(); - - pre_suspend(); - - /* - * We'll stop somewhere inside this hypercall. When it returns, - * we'll start resuming after the restore. - */ - HYPERVISOR_suspend(virt_to_mfn(xen_start_info)); - - shutting_down = SHUTDOWN_INVALID; - - post_suspend(); - - gnttab_resume(); - - irq_resume(); - - time_resume(); - - switch_idle_mm(); - - local_irq_enable(); - - xencons_resume(); - - xenbus_resume(); - - smp_resume(); - - return err; -} static int shutdown_process(void *__unused) { @@ -222,11 +26,13 @@ static int shutdown_process(void *__unus if ((shutting_down == SHUTDOWN_POWEROFF) || (shutting_down == SHUTDOWN_HALT)) { - if (execve("/sbin/poweroff", poweroff_argv, envp) < 0) { + if (call_usermodehelper_keys("/sbin/poweroff", poweroff_argv, envp, NULL, 0) < 0) { +#ifdef CONFIG_XEN sys_reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_POWER_OFF, NULL); +#endif /* CONFIG_XEN */ } } @@ -235,29 +41,21 @@ static int shutdown_process(void *__unus return 0; } -static int kthread_create_on_cpu(int (*f)(void *arg), - void *arg, - const char *name, - int cpu) -{ - struct task_struct *p; - p = kthread_create(f, arg, name); - if (IS_ERR(p)) - return PTR_ERR(p); - kthread_bind(p, cpu); - wake_up_process(p); - return 0; -} static void __shutdown_handler(void *unused) { int err; +#ifdef CONFIG_XEN if (shutting_down != SHUTDOWN_SUSPEND) err = kernel_thread(shutdown_process, NULL, CLONE_FS | CLONE_FILES); else err = kthread_create_on_cpu(__do_suspend, NULL, "suspend", 0); +#else /* !CONFIG_XEN */ + err = kernel_thread(shutdown_process, NULL, + CLONE_FS | CLONE_FILES); +#endif /* !CONFIG_XEN */ if (err < 0) { printk(KERN_WARNING "Error creating shutdown process (%d): " @@ -272,6 +70,8 @@ static void shutdown_handler(struct xenb char *str; struct xenbus_transaction xbt; int err; + + int cad_pid = 1; if (shutting_down != SHUTDOWN_INVALID) return; @@ -298,7 +98,7 @@ static void shutdown_handler(struct xenb if (strcmp(str, "poweroff") == 0) shutting_down = SHUTDOWN_POWEROFF; else if (strcmp(str, "reboot") == 0) - ctrl_alt_del(); + kill_proc(cad_pid, SIGINT, 1); else if (strcmp(str, "suspend") == 0) shutting_down = SHUTDOWN_SUSPEND; else if (strcmp(str, "halt") == 0) @@ -364,10 +164,14 @@ static int setup_shutdown_watcher(struct err = register_xenbus_watch(&shutdown_watch); if (err) printk(KERN_ERR "Failed to set shutdown watcher\n"); + else + xenbus_write(XBT_NIL, "control", "feature-reboot", "1"); err = register_xenbus_watch(&sysrq_watch); if (err) printk(KERN_ERR "Failed to set sysrq watcher\n"); + else + xenbus_write(XBT_NIL, "control", "feature-sysrq", "1"); return NOTIFY_DONE; } @@ -378,6 +182,7 @@ static int __init setup_shutdown_event(v .notifier_call = setup_shutdown_watcher }; register_xenstore_notifier(&xenstore_notifier); + return 0; } diff -r 159af40a1b37 -r 15b5cc51db30 linux-2.6-xen-sparse/drivers/xen/netback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Tue Oct 31 11:44:28 2006 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Tue Oct 31 11:44:47 2006 +0000 @@ -166,9 +166,6 @@ netif_t *netif_alloc(domid_t domid, unsi SET_ETHTOOL_OPS(dev, &network_ethtool_ops); dev->tx_queue_len = netbk_queue_length; - if (dev->tx_queue_len != 0) - printk(KERN_WARNING "netbk: WARNING: device '%s' has non-zero " - "queue length (%lu)!\n", dev->name, dev->tx_queue_len); /* * Initialise a dummy MAC address. We choose the numerically diff -r 159af40a1b37 -r 15b5cc51db30 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Tue Oct 31 11:44:28 2006 +0000 +++ b/tools/python/xen/xend/image.py Tue Oct 31 11:44:47 2006 +0000 @@ -282,6 +282,7 @@ class HVMImageHandler(ImageHandler): log.debug("apic = %d", self.apic) self.register_shutdown_watch() + self.register_reboot_feature_watch() return xc.hvm_build(dom = self.vm.getDomid(), image = self.kernel, @@ -416,6 +417,7 @@ class HVMImageHandler(ImageHandler): def destroy(self): self.unregister_shutdown_watch(); + self.unregister_reboot_feature_watch(); if not self.pid: return os.kill(self.pid, signal.SIGKILL) @@ -457,6 +459,39 @@ class HVMImageHandler(ImageHandler): vm.refreshShutdown(vm.info) return 1 # Keep watching + + def register_reboot_feature_watch(self): + """ add xen store watch on control/feature-reboot """ + self.rebootModuleWatch = xswatch(self.vm.dompath + "/control/feature-reboot", \ + self.hvm_reboot_feature) + log.debug("hvm reboot feature watch registered") + + def unregister_reboot_feature_watch(self): + """Remove the watch on the control/feature-reboot, if any. Nothrow + guarantee.""" + + try: + if self.rebootFeatureWatch: + self.rebootFeatureWatch.unwatch() + except: + log.exception("Unwatching hvm reboot feature watch failed.") + self.rebootFeatureWatch = None + log.debug("hvm reboot feature watch unregistered") + + def hvm_reboot_feature(self, _): + """ watch call back on node control/feature-reboot, + if node changed, this function will be called + """ + xd = xen.xend.XendDomain.instance() + vm = xd.domain_lookup( self.vm.getDomid() ) + + status = vm.readDom('control/feature-reboot') + log.debug("hvm_reboot_feature fired, module status=%s", status) + if status == '1': + self.unregister_shutdown_watch() + + return 1 # Keep watching + class IA64_HVM_ImageHandler(HVMImageHandler): diff -r 159af40a1b37 -r 15b5cc51db30 unmodified_drivers/linux-2.6/Makefile --- a/unmodified_drivers/linux-2.6/Makefile Tue Oct 31 11:44:28 2006 +0000 +++ b/unmodified_drivers/linux-2.6/Makefile Tue Oct 31 11:44:47 2006 +0000 @@ -4,3 +4,4 @@ obj-m += xenbus/ obj-m += xenbus/ obj-m += blkfront/ obj-m += netfront/ +obj-m += util/ diff -r 159af40a1b37 -r 15b5cc51db30 unmodified_drivers/linux-2.6/mkbuildtree --- a/unmodified_drivers/linux-2.6/mkbuildtree Tue Oct 31 11:44:28 2006 +0000 +++ b/unmodified_drivers/linux-2.6/mkbuildtree Tue Oct 31 11:44:47 2006 +0000 @@ -22,6 +22,7 @@ ln -sf ${XL}/drivers/xen/core/gnttab.c p ln -sf ${XL}/drivers/xen/core/gnttab.c platform-pci ln -sf ${XL}/drivers/xen/core/features.c platform-pci ln -sf ${XL}/drivers/xen/core/xen_proc.c xenbus +ln -sf ${XL}/drivers/xen/core/reboot.c util mkdir -p include mkdir -p include/xen diff -r 159af40a1b37 -r 15b5cc51db30 xen/common/sched_credit.c --- a/xen/common/sched_credit.c Tue Oct 31 11:44:28 2006 +0000 +++ b/xen/common/sched_credit.c Tue Oct 31 11:44:47 2006 +0000 @@ -82,19 +82,12 @@ printk("\t%-30s = %u\n", #_X, CSCHED_STAT(_X)); \ } while ( 0 ); +/* + * Try and keep often cranked stats on top so they'll fit on one + * cache line. + */ #define CSCHED_STATS_EXPAND_SCHED(_MACRO) \ - _MACRO(vcpu_init) \ - _MACRO(vcpu_sleep) \ - _MACRO(vcpu_wake_running) \ - _MACRO(vcpu_wake_onrunq) \ - _MACRO(vcpu_wake_runnable) \ - _MACRO(vcpu_wake_not_runnable) \ - _MACRO(dom_destroy) \ _MACRO(schedule) \ - _MACRO(tickle_local_idler) \ - _MACRO(tickle_local_over) \ - _MACRO(tickle_local_under) \ - _MACRO(tickle_local_other) \ _MACRO(acct_run) \ _MACRO(acct_no_work) \ _MACRO(acct_balance) \ @@ -102,20 +95,28 @@ _MACRO(acct_min_credit) \ _MACRO(acct_vcpu_active) \ _MACRO(acct_vcpu_idle) \ - _MACRO(acct_vcpu_credit_min) - -#define CSCHED_STATS_EXPAND_SMP_LOAD_BALANCE(_MACRO) \ - _MACRO(vcpu_migrate) \ - _MACRO(load_balance_idle) \ - _MACRO(load_balance_over) \ - _MACRO(load_balance_other) \ - _MACRO(steal_trylock_failed) \ - _MACRO(steal_peer_down) \ - _MACRO(steal_peer_idle) \ - _MACRO(steal_peer_running) \ - _MACRO(steal_peer_pinned) \ - _MACRO(tickle_idlers_none) \ - _MACRO(tickle_idlers_some) + _MACRO(vcpu_sleep) \ + _MACRO(vcpu_wake_running) \ + _MACRO(vcpu_wake_onrunq) \ + _MACRO(vcpu_wake_runnable) \ + _MACRO(vcpu_wake_not_runnable) \ + _MACRO(tickle_local_idler) \ + _MACRO(tickle_local_over) \ + _MACRO(tickle_local_under) \ + _MACRO(tickle_local_other) \ + _MACRO(tickle_idlers_none) \ + _MACRO(tickle_idlers_some) \ + _MACRO(vcpu_migrate) \ + _MACRO(load_balance_idle) \ + _MACRO(load_balance_over) \ + _MACRO(load_balance_other) \ + _MACRO(steal_trylock_failed) \ + _MACRO(steal_peer_down) \ + _MACRO(steal_peer_idle) \ + _MACRO(steal_peer_running) \ + _MACRO(steal_peer_pinned) \ + _MACRO(vcpu_init) \ + _MACRO(dom_destroy) #ifndef NDEBUG #define CSCHED_STATS_EXPAND_CHECKS(_MACRO) \ @@ -124,10 +125,9 @@ #define CSCHED_STATS_EXPAND_CHECKS(_MACRO) #endif -#define CSCHED_STATS_EXPAND(_MACRO) \ - CSCHED_STATS_EXPAND_SCHED(_MACRO) \ - CSCHED_STATS_EXPAND_SMP_LOAD_BALANCE(_MACRO) \ - CSCHED_STATS_EXPAND_CHECKS(_MACRO) +#define CSCHED_STATS_EXPAND(_MACRO) \ + CSCHED_STATS_EXPAND_CHECKS(_MACRO) \ + CSCHED_STATS_EXPAND_SCHED(_MACRO) #define CSCHED_STATS_RESET() \ do \ @@ -177,11 +177,14 @@ struct csched_vcpu { struct csched_dom *sdom; struct vcpu *vcpu; atomic_t credit; - int credit_last; - uint32_t credit_incr; - uint32_t state_active; - uint32_t state_idle; int16_t pri; + struct { + int credit_last; + uint32_t credit_incr; + uint32_t state_active; + uint32_t state_idle; + uint32_t migrate; + } stats; }; /* @@ -404,7 +407,7 @@ csched_vcpu_acct(struct csched_vcpu *svc if ( list_empty(&svc->active_vcpu_elem) ) { CSCHED_STAT_CRANK(acct_vcpu_active); - svc->state_active++; + svc->stats.state_active++; sdom->active_vcpu_count++; list_add(&svc->active_vcpu_elem, &sdom->active_vcpu); @@ -435,7 +438,7 @@ __csched_vcpu_acct_idle_locked(struct cs BUG_ON( list_empty(&svc->active_vcpu_elem) ); CSCHED_STAT_CRANK(acct_vcpu_idle); - svc->state_idle++; + svc->stats.state_idle++; sdom->active_vcpu_count--; list_del_init(&svc->active_vcpu_elem); @@ -495,11 +498,8 @@ csched_vcpu_init(struct vcpu *vc) svc->sdom = sdom; svc->vcpu = vc; atomic_set(&svc->credit, 0); - svc->credit_last = 0; - svc->credit_incr = 0U; - svc->state_active = 0U; - svc->state_idle = 0U; svc->pri = pri; + memset(&svc->stats, 0, sizeof(svc->stats)); vc->sched_priv = svc; CSCHED_VCPU_CHECK(vc); @@ -864,8 +864,8 @@ csched_acct(void) } } - svc->credit_last = credit; - svc->credit_incr = credit_fair; + svc->stats.credit_last = credit; + svc->stats.credit_incr = credit_fair; credit_balance += credit; } } @@ -1014,6 +1014,7 @@ csched_load_balance(int cpu, struct csch if ( speer ) { CSCHED_STAT_CRANK(vcpu_migrate); + speer->stats.migrate++; return speer; } } @@ -1100,12 +1101,13 @@ csched_dump_vcpu(struct csched_vcpu *svc if ( sdom ) { - printk(" credit=%i (%d+%u) {a=%u i=%u w=%u}", + printk(" credit=%i (%d+%u) {a/i=%u/%u m=%u w=%u}", atomic_read(&svc->credit), - svc->credit_last, - svc->credit_incr, - svc->state_active, - svc->state_idle, + svc->stats.credit_last, + svc->stats.credit_incr, + svc->stats.state_active, + svc->stats.state_idle, + svc->stats.migrate, sdom->weight); } diff -r 159af40a1b37 -r 15b5cc51db30 linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c Tue Oct 31 11:44:47 2006 +0000 @@ -0,0 +1,202 @@ +#define __KERNEL_SYSCALLS__ +#include <linux/version.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/unistd.h> +#include <linux/module.h> +#include <linux/reboot.h> +#include <linux/sysrq.h> +#include <linux/stringify.h> +#include <asm/irq.h> +#include <asm/mmu_context.h> +#include <xen/evtchn.h> +#include <asm/hypervisor.h> +#include <xen/interface/dom0_ops.h> +#include <xen/xenbus.h> +#include <linux/cpu.h> +#include <linux/kthread.h> +#include <xen/gnttab.h> +#include <xen/xencons.h> +#include <xen/cpu_hotplug.h> +#include <xen/reboot.h> + +#if defined(__i386__) || defined(__x86_64__) + +/* + * Power off function, if any + */ +void (*pm_power_off)(void); +EXPORT_SYMBOL(pm_power_off); + +void machine_emergency_restart(void) +{ + /* We really want to get pending console data out before we die. */ + xencons_force_flush(); + HYPERVISOR_shutdown(SHUTDOWN_reboot); +} + +void machine_restart(char * __unused) +{ + machine_emergency_restart(); +} + +void machine_halt(void) +{ + machine_power_off(); +} + +void machine_power_off(void) +{ + /* We really want to get pending console data out before we die. */ + xencons_force_flush(); + if (pm_power_off) + pm_power_off(); + HYPERVISOR_shutdown(SHUTDOWN_poweroff); +} + +int reboot_thru_bios = 0; /* for dmi_scan.c */ +EXPORT_SYMBOL(machine_restart); +EXPORT_SYMBOL(machine_halt); +EXPORT_SYMBOL(machine_power_off); + +/* Ensure we run on the idle task page tables so that we will + switch page tables before running user space. This is needed + on architectures with separate kernel and user page tables + because the user page table pointer is not saved/restored. */ +static void switch_idle_mm(void) +{ + struct mm_struct *mm = current->active_mm; + + if (mm == &init_mm) + return; + + atomic_inc(&init_mm.mm_count); + switch_mm(mm, &init_mm, current); + current->active_mm = &init_mm; + mmdrop(mm); +} + +static void pre_suspend(void) +{ + HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; + clear_fixmap(FIX_SHARED_INFO); + + xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn); + xen_start_info->console.domU.mfn = + mfn_to_pfn(xen_start_info->console.domU.mfn); +} + +static void post_suspend(void) +{ + int i, j, k, fpp; + extern unsigned long max_pfn; + extern unsigned long *pfn_to_mfn_frame_list_list; + extern unsigned long *pfn_to_mfn_frame_list[]; + + set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info); + + HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO); + + memset(empty_zero_page, 0, PAGE_SIZE); + + HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = + virt_to_mfn(pfn_to_mfn_frame_list_list); + + fpp = PAGE_SIZE/sizeof(unsigned long); + for (i = 0, j = 0, k = -1; i < max_pfn; i += fpp, j++) { + if ((j % fpp) == 0) { + k++; + pfn_to_mfn_frame_list_list[k] = + virt_to_mfn(pfn_to_mfn_frame_list[k]); + j = 0; + } + pfn_to_mfn_frame_list[k][j] = + virt_to_mfn(&phys_to_machine_mapping[i]); + } + HYPERVISOR_shared_info->arch.max_pfn = max_pfn; +} + +#else /* !(defined(__i386__) || defined(__x86_64__)) */ + +#define switch_idle_mm() ((void)0) +#define mm_pin_all() ((void)0) +#define pre_suspend() ((void)0) +#define post_suspend() ((void)0) + +#endif + +int __do_suspend(void *ignore) +{ + int err; + + extern void time_resume(void); + + BUG_ON(smp_processor_id() != 0); + BUG_ON(in_interrupt()); + +#if defined(__i386__) || defined(__x86_64__) + if (xen_feature(XENFEAT_auto_translated_physmap)) { + printk(KERN_WARNING "Cannot suspend in " + "auto_translated_physmap mode.\n"); + return -EOPNOTSUPP; + } +#endif + + err = smp_suspend(); + if (err) + return err; + + xenbus_suspend(); + + preempt_disable(); + + mm_pin_all(); + local_irq_disable(); + preempt_enable(); + + gnttab_suspend(); + + pre_suspend(); + + /* + * We'll stop somewhere inside this hypercall. When it returns, + * we'll start resuming after the restore. + */ + HYPERVISOR_suspend(virt_to_mfn(xen_start_info)); + + shutting_down = SHUTDOWN_INVALID; + + post_suspend(); + + gnttab_resume(); + + irq_resume(); + + time_resume(); + + switch_idle_mm(); + + local_irq_enable(); + + xencons_resume(); + + xenbus_resume(); + + smp_resume(); + + return err; +} + +int kthread_create_on_cpu(int (*f)(void *arg), + void *arg, + const char *name, + int cpu) +{ + struct task_struct *p; + p = kthread_create(f, arg, name); + if (IS_ERR(p)) + return PTR_ERR(p); + kthread_bind(p, cpu); + wake_up_process(p); + return 0; +} diff -r 159af40a1b37 -r 15b5cc51db30 linux-2.6-xen-sparse/include/xen/reboot.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linux-2.6-xen-sparse/include/xen/reboot.h Tue Oct 31 11:44:47 2006 +0000 @@ -0,0 +1,19 @@ +#define SHUTDOWN_INVALID -1 +#define SHUTDOWN_POWEROFF 0 +#define SHUTDOWN_SUSPEND 2 +/* Code 3 is SHUTDOWN_CRASH, which we don't use because the domain can only + * report a crash, not be instructed to crash! + * HALT is the same as POWEROFF, as far as we're concerned. The tools use + * the distinction when we return the reason code to them. + */ +#define SHUTDOWN_HALT 4 + +/****************************************************************************** + * Stop/pickle callback handling. + */ + +/* Ignore multiple shutdown requests. */ +static int shutting_down = SHUTDOWN_INVALID; + +int kthread_create_on_cpu(int (*f)(void *), void *, const char *, int); +int __do_suspend(void *); diff -r 159af40a1b37 -r 15b5cc51db30 unmodified_drivers/linux-2.6/util/Kbuild --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/unmodified_drivers/linux-2.6/util/Kbuild Tue Oct 31 11:44:47 2006 +0000 @@ -0,0 +1,3 @@ +include $(M)/overrides.mk + +obj-m := reboot.o _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |