* [PATCH -mm 2/2] kexec jump -v11: save/restore device state
@ 2008-06-10 7:15 Huang, Ying
2008-06-10 18:01 ` [linux-pm] " Len Brown
2008-06-11 16:30 ` Vivek Goyal
0 siblings, 2 replies; 11+ messages in thread
From: Huang, Ying @ 2008-06-10 7:15 UTC (permalink / raw)
To: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, Vivek Goyal
Cc: linux-kernel, linux-pm, Kexec Mailing List
This patch implements devices state save/restore before after kexec.
This patch together with features in kexec_jump patch can be used for
following:
- A simple hibernation implementation without ACPI support. You can
kexec a hibernating kernel, save the memory image of original system
and shutdown the system. When resuming, you restore the memory image
of original system via ordinary kexec load then jump back.
- Kernel/system debug through making system snapshot. You can make
system snapshot, jump back, do some thing and make another system
snapshot.
- Cooperative multi-kernel/system. With kexec jump, you can switch
between several kernels/systems quickly without boot process except
the first time. This appears like swap a whole kernel/system out/in.
- A general method to call program in physical mode (paging turning
off). This can be used to invoke BIOS code under Linux.
The following user-space tools can be used with kexec jump:
- kexec-tools needs to be patched to support kexec jump. The patches
and the precompiled kexec can be download from the following URL:
source: http://khibernation.sourceforge.net/download/release_v10/kexec-tools/kexec-tools-src_git_kh10.tar.bz2
patches: http://khibernation.sourceforge.net/download/release_v10/kexec-tools/kexec-tools-patches_git_kh10.tar.bz2
binary: http://khibernation.sourceforge.net/download/release_v10/kexec-tools/kexec_git_kh10
- makedumpfile with patches are used as memory image saving tool, it
can exclude free pages from original kernel memory image file. The
patches and the precompiled makedumpfile can be download from the
following URL:
source: http://khibernation.sourceforge.net/download/release_v10/makedumpfile/makedumpfile-src_cvs_kh10.tar.bz2
patches: http://khibernation.sourceforge.net/download/release_v10/makedumpfile/makedumpfile-patches_cvs_kh10.tar.bz2
binary: http://khibernation.sourceforge.net/download/release_v10/makedumpfile/makedumpfile_cvs_kh10
- An initramfs image can be used as the root file system of kexeced
kernel. An initramfs image built with "BuildRoot" can be downloaded
from the following URL:
initramfs image: http://khibernation.sourceforge.net/download/release_v10/initramfs/rootfs_cvs_kh10.gz
All user space tools above are included in the initramfs image.
Usage example of simple hibernation:
1. Compile and install patched kernel with following options selected:
CONFIG_X86_32=y
CONFIG_RELOCATABLE=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
CONFIG_PM=y
2. Build an initramfs image contains kexec-tool and makedumpfile, or
download the pre-built initramfs image, called rootfs.gz in
following text.
3. Prepare a partition to save memory image of original kernel, called
hibernating partition in following text.
4. Boot kernel compiled in step 1 (kernel A).
5. In the kernel A, load kernel compiled in step 1 (kernel B) with
/sbin/kexec. The shell command line can be as follow:
/sbin/kexec --load-preserve-context /boot/bzImage --mem-min=0x100000
--mem-max=0xffffff --initrd=rootfs.gz
6. Boot the kernel B with following shell command line:
/sbin/kexec -e
7. The kernel B will boot as normal kexec. In kernel B the memory
image of kernel A can be saved into hibernating partition as
follow:
jump_back_entry=`cat /proc/cmdline | tr ' ' '\n' | grep kexec_jump_back_entry | cut -d '='`
echo $jump_back_entry > kexec_jump_back_entry
cp /proc/vmcore dump.elf
Then you can shutdown the machine as normal.
8. Boot kernel compiled in step 1 (kernel C). Use the rootfs.gz as
root file system.
9. In kernel C, load the memory image of kernel A as follow:
/sbin/kexec -l --args-none --entry=`cat kexec_jump_back_entry` dump.elf
10. Jump back to the kernel A as follow:
/sbin/kexec -e
Then, kernel A is resumed.
Implementation point:
To support jumping between two kernels, before jumping to (executing)
the new kernel and jumping back to the original kernel, the devices
are put into quiescent state, and the state of devices and CPU is
saved. After jumping back from kexeced kernel and jumping to the new
kernel, the state of devices and CPU are restored accordingly. The
devices/CPU state save/restore code of software suspend is called to
implement corresponding function.
Known issues:
- Because the segment number supported by sys_kexec_load is limited,
hibernation image with many segments may not be load. This is
planned to be eliminated by adding a new flag to sys_kexec_load to
make a image can be loaded with multiple sys_kexec_load invoking.
ChangeLog:
v11:
- Add disable_IO_APIC() to machine_kexec() to put IO APIC into legacy
mode before executing new kernel.
- Base on top of new hibernation/restore device driver callback.
v10:
- Split from original kexec_jump patch.
Now, only the i386 architecture is supported. The patchset is based on
Linux kernel 2.6.26-rc5-mm1, and has been tested on IBM T42 with ACPI
on and off.
Signed-off-by: Huang Ying <ying.huang@intel.com>
---
arch/x86/kernel/machine_kexec_32.c | 6 +++++
include/linux/suspend.h | 2 +
kernel/kexec.c | 43 ++++++++++++++++++++++++++++++++++++-
kernel/power/power.h | 2 -
4 files changed, 50 insertions(+), 3 deletions(-)
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -25,6 +25,10 @@
#include <linux/utsname.h>
#include <linux/numa.h>
#include <linux/suspend.h>
+#include <linux/freezer.h>
+#include <linux/pm.h>
+#include <linux/cpu.h>
+#include <linux/console.h>
#include <asm/page.h>
#include <asm/uaccess.h>
@@ -1427,8 +1431,34 @@ module_init(crash_save_vmcoreinfo_init)
int kexec_jump(struct kimage *image)
{
+ int error = 0;
+
+ mutex_lock(&pm_mutex);
if (image->preserve_context) {
+ pm_prepare_console();
+ error = freeze_processes();
+ if (error) {
+ error = -EBUSY;
+ goto Exit;
+ }
+ suspend_console();
+ error = device_suspend(PMSG_FREEZE);
+ if (error)
+ goto Resume_console;
+ error = disable_nonboot_cpus();
+ if (error)
+ goto Resume_devices;
local_irq_disable();
+ /* At this point, device_suspend() has been called,
+ * but *not* device_power_down(). We *must*
+ * device_power_down() now. Otherwise, drivers for
+ * some devices (e.g. interrupt controllers) become
+ * desynchronized with the actual state of the
+ * hardware at resume time, and evil weirdness ensues.
+ */
+ error = device_power_down(PMSG_FREEZE);
+ if (error)
+ goto Enable_irqs;
save_processor_state();
}
@@ -1436,7 +1466,18 @@ int kexec_jump(struct kimage *image)
if (image->preserve_context) {
restore_processor_state();
+ device_power_up(PMSG_RESTORE);
+ Enable_irqs:
local_irq_enable();
+ enable_nonboot_cpus();
+ Resume_devices:
+ device_resume(PMSG_RESTORE);
+ Resume_console:
+ resume_console();
+ thaw_processes();
+ Exit:
+ pm_restore_console();
}
- return 0;
+ mutex_unlock(&pm_mutex);
+ return error;
}
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -53,8 +53,6 @@ extern int hibernation_platform_enter(vo
extern int pfn_is_nosave(unsigned long);
-extern struct mutex pm_mutex;
-
#define power_attr(_name) \
static struct kobj_attribute _name##_attr = { \
.attr = { \
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
@@ -266,4 +266,6 @@ static inline void register_nosave_regio
}
#endif
+extern struct mutex pm_mutex;
+
#endif /* _LINUX_SUSPEND_H */
--- a/arch/x86/kernel/machine_kexec_32.c
+++ b/arch/x86/kernel/machine_kexec_32.c
@@ -125,6 +125,12 @@ void machine_kexec(struct kimage *image)
/* Interrupts aren't acceptable while we reboot */
local_irq_disable();
+ if (image->preserve_context) {
+#ifdef CONFIG_X86_IO_APIC
+ disable_IO_APIC();
+#endif
+ }
+
control_page = page_address(image->control_code_page);
memcpy(control_page, relocate_kernel, PAGE_SIZE/2);
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [linux-pm] [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-10 7:15 [PATCH -mm 2/2] kexec jump -v11: save/restore device state Huang, Ying
@ 2008-06-10 18:01 ` Len Brown
2008-06-11 1:01 ` Huang, Ying
2008-06-11 16:30 ` Vivek Goyal
1 sibling, 1 reply; 11+ messages in thread
From: Len Brown @ 2008-06-10 18:01 UTC (permalink / raw)
To: Huang, Ying
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, Vivek Goyal, linux-pm, Kexec Mailing List,
linux-kernel
On Tue, 10 Jun 2008, Huang, Ying wrote:
> This patch implements devices state save/restore before after kexec.
>
>
> This patch together with features in kexec_jump patch can be used for
> following:
>
> - A simple hibernation implementation without ACPI support. You can
> kexec a hibernating kernel, save the memory image of original system
> and shutdown the system. When resuming, you restore the memory image
> of original system via ordinary kexec load then jump back.
What part of ACPI's role in hibernation are you trying to avoid
1. enabling wake devices
2. removing power from the system
3. something else?
thanks,
-Len
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [linux-pm] [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-10 18:01 ` [linux-pm] " Len Brown
@ 2008-06-11 1:01 ` Huang, Ying
2008-06-11 8:21 ` Len Brown
2008-06-13 18:05 ` Vivek Goyal
0 siblings, 2 replies; 11+ messages in thread
From: Huang, Ying @ 2008-06-11 1:01 UTC (permalink / raw)
To: Len Brown
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, Vivek Goyal, linux-pm, Kexec Mailing List,
linux-kernel
On Tue, 2008-06-10 at 14:01 -0400, Len Brown wrote:
>
> On Tue, 10 Jun 2008, Huang, Ying wrote:
>
> > This patch implements devices state save/restore before after kexec.
> >
> >
> > This patch together with features in kexec_jump patch can be used for
> > following:
> >
> > - A simple hibernation implementation without ACPI support. You can
> > kexec a hibernating kernel, save the memory image of original system
> > and shutdown the system. When resuming, you restore the memory image
> > of original system via ordinary kexec load then jump back.
>
> What part of ACPI's role in hibernation are you trying to avoid
> 1. enabling wake devices
> 2. removing power from the system
> 3. something else?
ACPI S5 is used instead of S4 for this simple hibernation
implementation. That is, before creating the hibernation image, the ACPI
_PTS is not executed, devices are not put into low power state and wake
devices are not enabled. After creating the hibernation image, the image
is saved to disk and system is shutdown (go to S5). When resuming from
hibernated image, ACPI _BFS and _WAK are not executed too.
Best Regards,
Huang Ying
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [linux-pm] [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-11 1:01 ` Huang, Ying
@ 2008-06-11 8:21 ` Len Brown
2008-06-11 9:46 ` Huang, Ying
2008-06-13 18:05 ` Vivek Goyal
1 sibling, 1 reply; 11+ messages in thread
From: Len Brown @ 2008-06-11 8:21 UTC (permalink / raw)
To: Huang, Ying
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, Vivek Goyal, linux-pm, Kexec Mailing List,
linux-kernel
On Wed, 11 Jun 2008, Huang, Ying wrote:
> On Tue, 2008-06-10 at 14:01 -0400, Len Brown wrote:
> >
> > On Tue, 10 Jun 2008, Huang, Ying wrote:
> >
> > > This patch implements devices state save/restore before after kexec.
> > >
> > >
> > > This patch together with features in kexec_jump patch can be used for
> > > following:
> > >
> > > - A simple hibernation implementation without ACPI support. You can
> > > kexec a hibernating kernel, save the memory image of original system
> > > and shutdown the system. When resuming, you restore the memory image
> > > of original system via ordinary kexec load then jump back.
> >
> > What part of ACPI's role in hibernation are you trying to avoid
> > 1. enabling wake devices
> > 2. removing power from the system
> > 3. something else?
>
> ACPI S5 is used instead of S4 for this simple hibernation
> implementation. That is, before creating the hibernation image, the ACPI
> _PTS is not executed, devices are not put into low power state and wake
> devices are not enabled. After creating the hibernation image, the image
> is saved to disk and system is shutdown (go to S5). When resuming from
> hibernated image, ACPI _BFS and _WAK are not executed too.
Doesn't that resume the devices and their drivers into an unknown state?
-Len
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [linux-pm] [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-11 8:21 ` Len Brown
@ 2008-06-11 9:46 ` Huang, Ying
0 siblings, 0 replies; 11+ messages in thread
From: Huang, Ying @ 2008-06-11 9:46 UTC (permalink / raw)
To: Len Brown
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, Vivek Goyal, linux-pm, Kexec Mailing List,
linux-kernel
On Wed, 2008-06-11 at 04:21 -0400, Len Brown wrote:
> On Wed, 11 Jun 2008, Huang, Ying wrote:
> > On Tue, 2008-06-10 at 14:01 -0400, Len Brown wrote:
> > >
> > > On Tue, 10 Jun 2008, Huang, Ying wrote:
> > >
> > > > This patch implements devices state save/restore before after kexec.
> > > >
> > > >
> > > > This patch together with features in kexec_jump patch can be used for
> > > > following:
> > > >
> > > > - A simple hibernation implementation without ACPI support. You can
> > > > kexec a hibernating kernel, save the memory image of original system
> > > > and shutdown the system. When resuming, you restore the memory image
> > > > of original system via ordinary kexec load then jump back.
> > >
> > > What part of ACPI's role in hibernation are you trying to avoid
> > > 1. enabling wake devices
> > > 2. removing power from the system
> > > 3. something else?
> >
> > ACPI S5 is used instead of S4 for this simple hibernation
> > implementation. That is, before creating the hibernation image, the ACPI
> > _PTS is not executed, devices are not put into low power state and wake
> > devices are not enabled. After creating the hibernation image, the image
> > is saved to disk and system is shutdown (go to S5). When resuming from
> > hibernated image, ACPI _BFS and _WAK are not executed too.
>
> Doesn't that resume the devices and their drivers into an unknown state?
device_suspend(PMSG_FREEZE) and device_power_down(PMSG_FREEZE) are
called before hibernation; device_power_up(PMSG_RESTORE) and
device_resume(PMSG_RESTORE) are called after restore. The new
hibernation/restore device driver callbacks introduced by Rafael is
used. So I think the device/driver state will be saved/restored
properly.
It is planed to support ACPI S4 in the future. But I think a hibernation
scheme without ACPI may be useful in some situation too.
Best Regards,
Huang Ying
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [linux-pm] [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-11 1:01 ` Huang, Ying
2008-06-11 8:21 ` Len Brown
@ 2008-06-13 18:05 ` Vivek Goyal
2008-06-16 1:29 ` Huang, Ying
1 sibling, 1 reply; 11+ messages in thread
From: Vivek Goyal @ 2008-06-13 18:05 UTC (permalink / raw)
To: Huang, Ying
Cc: Len Brown, Eric W. Biederman, Pavel Machek, nigel,
Rafael J. Wysocki, Andrew Morton, linux-pm, Kexec Mailing List,
linux-kernel
On Wed, Jun 11, 2008 at 09:01:14AM +0800, Huang, Ying wrote:
> On Tue, 2008-06-10 at 14:01 -0400, Len Brown wrote:
> >
> > On Tue, 10 Jun 2008, Huang, Ying wrote:
> >
> > > This patch implements devices state save/restore before after kexec.
> > >
> > >
> > > This patch together with features in kexec_jump patch can be used for
> > > following:
> > >
> > > - A simple hibernation implementation without ACPI support. You can
> > > kexec a hibernating kernel, save the memory image of original system
> > > and shutdown the system. When resuming, you restore the memory image
> > > of original system via ordinary kexec load then jump back.
> >
> > What part of ACPI's role in hibernation are you trying to avoid
> > 1. enabling wake devices
> > 2. removing power from the system
> > 3. something else?
>
> ACPI S5 is used instead of S4 for this simple hibernation
> implementation. That is, before creating the hibernation image, the ACPI
> _PTS is not executed, devices are not put into low power state and wake
> devices are not enabled. After creating the hibernation image, the image
> is saved to disk and system is shutdown (go to S5). When resuming from
> hibernated image, ACPI _BFS and _WAK are not executed too.
Hi huang,
Can't we implement ACPI S5 state as an option in current hibernation
framework? Or kexec jump is a requirement for that?
Thanks
Vivek
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [linux-pm] [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-13 18:05 ` Vivek Goyal
@ 2008-06-16 1:29 ` Huang, Ying
0 siblings, 0 replies; 11+ messages in thread
From: Huang, Ying @ 2008-06-16 1:29 UTC (permalink / raw)
To: Vivek Goyal
Cc: Len Brown, Eric W. Biederman, Pavel Machek, nigel,
Rafael J. Wysocki, Andrew Morton, linux-pm, Kexec Mailing List,
linux-kernel
Hi, Vivek,
On Fri, 2008-06-13 at 14:05 -0400, Vivek Goyal wrote:
[...]
>
> Can't we implement ACPI S5 state as an option in current hibernation
> framework? Or kexec jump is a requirement for that?
ACPI S5 has been implemented in current hibernation framework. If you
do:
echo shutdown > /sys/power/disk
ACPI S5 instead of S4 will be used. That is, corresponding ACPI method
is not executed.
Best Regards,
Huang Ying
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-10 7:15 [PATCH -mm 2/2] kexec jump -v11: save/restore device state Huang, Ying
2008-06-10 18:01 ` [linux-pm] " Len Brown
@ 2008-06-11 16:30 ` Vivek Goyal
2008-06-12 0:53 ` Huang, Ying
1 sibling, 1 reply; 11+ messages in thread
From: Vivek Goyal @ 2008-06-11 16:30 UTC (permalink / raw)
To: Huang, Ying
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, linux-kernel, linux-pm, Kexec Mailing List
On Tue, Jun 10, 2008 at 03:15:06PM +0800, Huang, Ying wrote:
> This patch implements devices state save/restore before after kexec.
>
>
> This patch together with features in kexec_jump patch can be used for
> following:
>
> - A simple hibernation implementation without ACPI support. You can
> kexec a hibernating kernel, save the memory image of original system
> and shutdown the system. When resuming, you restore the memory image
> of original system via ordinary kexec load then jump back.
>
> - Kernel/system debug through making system snapshot. You can make
> system snapshot, jump back, do some thing and make another system
> snapshot.
>
> - Cooperative multi-kernel/system. With kexec jump, you can switch
> between several kernels/systems quickly without boot process except
> the first time. This appears like swap a whole kernel/system out/in.
>
> - A general method to call program in physical mode (paging turning
> off). This can be used to invoke BIOS code under Linux.
>
>
> The following user-space tools can be used with kexec jump:
>
> - kexec-tools needs to be patched to support kexec jump. The patches
> and the precompiled kexec can be download from the following URL:
> source: http://khibernation.sourceforge.net/download/release_v10/kexec-tools/kexec-tools-src_git_kh10.tar.bz2
> patches: http://khibernation.sourceforge.net/download/release_v10/kexec-tools/kexec-tools-patches_git_kh10.tar.bz2
> binary: http://khibernation.sourceforge.net/download/release_v10/kexec-tools/kexec_git_kh10
>
> - makedumpfile with patches are used as memory image saving tool, it
> can exclude free pages from original kernel memory image file. The
> patches and the precompiled makedumpfile can be download from the
> following URL:
> source: http://khibernation.sourceforge.net/download/release_v10/makedumpfile/makedumpfile-src_cvs_kh10.tar.bz2
> patches: http://khibernation.sourceforge.net/download/release_v10/makedumpfile/makedumpfile-patches_cvs_kh10.tar.bz2
> binary: http://khibernation.sourceforge.net/download/release_v10/makedumpfile/makedumpfile_cvs_kh10
>
> - An initramfs image can be used as the root file system of kexeced
> kernel. An initramfs image built with "BuildRoot" can be downloaded
> from the following URL:
> initramfs image: http://khibernation.sourceforge.net/download/release_v10/initramfs/rootfs_cvs_kh10.gz
> All user space tools above are included in the initramfs image.
>
>
> Usage example of simple hibernation:
>
> 1. Compile and install patched kernel with following options selected:
>
> CONFIG_X86_32=y
> CONFIG_RELOCATABLE=y
> CONFIG_KEXEC=y
> CONFIG_CRASH_DUMP=y
> CONFIG_PM=y
>
> 2. Build an initramfs image contains kexec-tool and makedumpfile, or
> download the pre-built initramfs image, called rootfs.gz in
> following text.
>
> 3. Prepare a partition to save memory image of original kernel, called
> hibernating partition in following text.
>
> 4. Boot kernel compiled in step 1 (kernel A).
>
> 5. In the kernel A, load kernel compiled in step 1 (kernel B) with
> /sbin/kexec. The shell command line can be as follow:
>
> /sbin/kexec --load-preserve-context /boot/bzImage --mem-min=0x100000
> --mem-max=0xffffff --initrd=rootfs.gz
>
> 6. Boot the kernel B with following shell command line:
>
> /sbin/kexec -e
>
> 7. The kernel B will boot as normal kexec. In kernel B the memory
> image of kernel A can be saved into hibernating partition as
> follow:
>
> jump_back_entry=`cat /proc/cmdline | tr ' ' '\n' | grep kexec_jump_back_entry | cut -d '='`
> echo $jump_back_entry > kexec_jump_back_entry
> cp /proc/vmcore dump.elf
>
> Then you can shutdown the machine as normal.
>
> 8. Boot kernel compiled in step 1 (kernel C). Use the rootfs.gz as
> root file system.
>
One of the concerns raised by hibernation people in the past was to use
single boot loader entry to boot normally as well while resuming a kernel.
So in this case a user either needs to maintain two boot-loader entries
or modify it on the fly. I wished there was a better way to handle that.
I am more interested in ability to have multiple kernel loaded in RAM
and capability to switch between them. Allows me to take non-disruptive
core dumps and somebody wanted to snapshots the kernels. That should
still work.
[..]
> --- a/arch/x86/kernel/machine_kexec_32.c
> +++ b/arch/x86/kernel/machine_kexec_32.c
> @@ -125,6 +125,12 @@ void machine_kexec(struct kimage *image)
> /* Interrupts aren't acceptable while we reboot */
> local_irq_disable();
>
> + if (image->preserve_context) {
> +#ifdef CONFIG_X86_IO_APIC
> + disable_IO_APIC();
> +#endif
I think it would be a good idea to put some kind of comment here. We
need to put APICs in legacy mode so that we can get timer interrupts
in second kernel. kexec/kdump paths already have calls to
disable_IO_APIC() in one form or other. kexec jump path also needs one.
Thanks
Vivek
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-11 16:30 ` Vivek Goyal
@ 2008-06-12 0:53 ` Huang, Ying
2008-06-12 13:02 ` Vivek Goyal
0 siblings, 1 reply; 11+ messages in thread
From: Huang, Ying @ 2008-06-12 0:53 UTC (permalink / raw)
To: Vivek Goyal
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, linux-kernel, linux-pm, Kexec Mailing List
On Wed, 2008-06-11 at 12:30 -0400, Vivek Goyal wrote:
[...]
> > Usage example of simple hibernation:
> >
> > 1. Compile and install patched kernel with following options selected:
> >
> > CONFIG_X86_32=y
> > CONFIG_RELOCATABLE=y
> > CONFIG_KEXEC=y
> > CONFIG_CRASH_DUMP=y
> > CONFIG_PM=y
> >
> > 2. Build an initramfs image contains kexec-tool and makedumpfile, or
> > download the pre-built initramfs image, called rootfs.gz in
> > following text.
> >
> > 3. Prepare a partition to save memory image of original kernel, called
> > hibernating partition in following text.
> >
> > 4. Boot kernel compiled in step 1 (kernel A).
> >
> > 5. In the kernel A, load kernel compiled in step 1 (kernel B) with
> > /sbin/kexec. The shell command line can be as follow:
> >
> > /sbin/kexec --load-preserve-context /boot/bzImage --mem-min=0x100000
> > --mem-max=0xffffff --initrd=rootfs.gz
> >
> > 6. Boot the kernel B with following shell command line:
> >
> > /sbin/kexec -e
> >
> > 7. The kernel B will boot as normal kexec. In kernel B the memory
> > image of kernel A can be saved into hibernating partition as
> > follow:
> >
> > jump_back_entry=`cat /proc/cmdline | tr ' ' '\n' | grep kexec_jump_back_entry | cut -d '='`
> > echo $jump_back_entry > kexec_jump_back_entry
> > cp /proc/vmcore dump.elf
> >
> > Then you can shutdown the machine as normal.
> >
> > 8. Boot kernel compiled in step 1 (kernel C). Use the rootfs.gz as
> > root file system.
> >
>
> One of the concerns raised by hibernation people in the past was to use
> single boot loader entry to boot normally as well while resuming a kernel.
>
> So in this case a user either needs to maintain two boot-loader entries
> or modify it on the fly. I wished there was a better way to handle that.
Now it is not needed to have two boot-loader entries, just one is
enough. Step 4 and step 8 can share the same boot-loader entries. The
rootfs.gz can be the normal initramfs or initrd when deployment. In
rootfs.gz, if there is a valid hibernation image, the hibernated system
will be restored, otherwise, normal boot process follows.
> I am more interested in ability to have multiple kernel loaded in RAM
> and capability to switch between them. Allows me to take non-disruptive
> core dumps and somebody wanted to snapshots the kernels. That should
> still work.
>
>
> [..]
> > --- a/arch/x86/kernel/machine_kexec_32.c
> > +++ b/arch/x86/kernel/machine_kexec_32.c
> > @@ -125,6 +125,12 @@ void machine_kexec(struct kimage *image)
> > /* Interrupts aren't acceptable while we reboot */
> > local_irq_disable();
> >
> > + if (image->preserve_context) {
> > +#ifdef CONFIG_X86_IO_APIC
> > + disable_IO_APIC();
> > +#endif
>
> I think it would be a good idea to put some kind of comment here. We
> need to put APICs in legacy mode so that we can get timer interrupts
> in second kernel. kexec/kdump paths already have calls to
> disable_IO_APIC() in one form or other. kexec jump path also needs one.
OK. I will add it.
Best Regards,
Huang Ying
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-12 0:53 ` Huang, Ying
@ 2008-06-12 13:02 ` Vivek Goyal
2008-06-13 1:18 ` Huang, Ying
0 siblings, 1 reply; 11+ messages in thread
From: Vivek Goyal @ 2008-06-12 13:02 UTC (permalink / raw)
To: Huang, Ying
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, linux-kernel, linux-pm, Kexec Mailing List
On Thu, Jun 12, 2008 at 08:53:39AM +0800, Huang, Ying wrote:
> On Wed, 2008-06-11 at 12:30 -0400, Vivek Goyal wrote:
> [...]
> > > Usage example of simple hibernation:
> > >
> > > 1. Compile and install patched kernel with following options selected:
> > >
> > > CONFIG_X86_32=y
> > > CONFIG_RELOCATABLE=y
> > > CONFIG_KEXEC=y
> > > CONFIG_CRASH_DUMP=y
> > > CONFIG_PM=y
> > >
> > > 2. Build an initramfs image contains kexec-tool and makedumpfile, or
> > > download the pre-built initramfs image, called rootfs.gz in
> > > following text.
> > >
> > > 3. Prepare a partition to save memory image of original kernel, called
> > > hibernating partition in following text.
> > >
> > > 4. Boot kernel compiled in step 1 (kernel A).
> > >
> > > 5. In the kernel A, load kernel compiled in step 1 (kernel B) with
> > > /sbin/kexec. The shell command line can be as follow:
> > >
> > > /sbin/kexec --load-preserve-context /boot/bzImage --mem-min=0x100000
> > > --mem-max=0xffffff --initrd=rootfs.gz
> > >
> > > 6. Boot the kernel B with following shell command line:
> > >
> > > /sbin/kexec -e
> > >
> > > 7. The kernel B will boot as normal kexec. In kernel B the memory
> > > image of kernel A can be saved into hibernating partition as
> > > follow:
> > >
> > > jump_back_entry=`cat /proc/cmdline | tr ' ' '\n' | grep kexec_jump_back_entry | cut -d '='`
> > > echo $jump_back_entry > kexec_jump_back_entry
> > > cp /proc/vmcore dump.elf
> > >
> > > Then you can shutdown the machine as normal.
> > >
> > > 8. Boot kernel compiled in step 1 (kernel C). Use the rootfs.gz as
> > > root file system.
> > >
> >
> > One of the concerns raised by hibernation people in the past was to use
> > single boot loader entry to boot normally as well while resuming a kernel.
> >
> > So in this case a user either needs to maintain two boot-loader entries
> > or modify it on the fly. I wished there was a better way to handle that.
>
> Now it is not needed to have two boot-loader entries, just one is
> enough. Step 4 and step 8 can share the same boot-loader entries. The
> rootfs.gz can be the normal initramfs or initrd when deployment. In
> rootfs.gz, if there is a valid hibernation image, the hibernated system
> will be restored, otherwise, normal boot process follows.
>
Few things I don't understand.
- Are you saying that hibernated image will be saved in initrd
(rootfs.gz)? But that saving is only in RAM, we never write back
it to disk?
- I thought we probably have to dedicate a raw partition kind of thing
for saving image and then modify boot loader command line to something
similar to, "resume=partition". Then initrd can go hunting for image
in respective partition (as specified by command line parameter) and if
image is not available then continue with normal boot.
Thanks
Vivek
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH -mm 2/2] kexec jump -v11: save/restore device state
2008-06-12 13:02 ` Vivek Goyal
@ 2008-06-13 1:18 ` Huang, Ying
0 siblings, 0 replies; 11+ messages in thread
From: Huang, Ying @ 2008-06-13 1:18 UTC (permalink / raw)
To: Vivek Goyal
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, linux-kernel, linux-pm, Kexec Mailing List
On Thu, 2008-06-12 at 09:02 -0400, Vivek Goyal wrote:
[...]
> Few things I don't understand.
>
> - Are you saying that hibernated image will be saved in initrd
> (rootfs.gz)? But that saving is only in RAM, we never write back
> it to disk?
No. Hibernated image should be saved in a dedicated raw partition as you
said below.
> - I thought we probably have to dedicate a raw partition kind of thing
> for saving image and then modify boot loader command line to something
> similar to, "resume=partition". Then initrd can go hunting for image
> in respective partition (as specified by command line parameter) and if
> image is not available then continue with normal boot.
Yes. But the boot-loader command line only need to be changed during
system install or hibernation setup. We need not change the location of
"hibernation partition" frequently.
So I think one boot-loader command line is sufficient for:
- normal boot
- normal boot a system to be hibernated
- boot helper system to restore the hibernated system
Best Regards,
Huang Ying
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2008-06-16 1:26 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-10 7:15 [PATCH -mm 2/2] kexec jump -v11: save/restore device state Huang, Ying
2008-06-10 18:01 ` [linux-pm] " Len Brown
2008-06-11 1:01 ` Huang, Ying
2008-06-11 8:21 ` Len Brown
2008-06-11 9:46 ` Huang, Ying
2008-06-13 18:05 ` Vivek Goyal
2008-06-16 1:29 ` Huang, Ying
2008-06-11 16:30 ` Vivek Goyal
2008-06-12 0:53 ` Huang, Ying
2008-06-12 13:02 ` Vivek Goyal
2008-06-13 1:18 ` Huang, Ying
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox