[lkml]   [2008]   [Jun]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    SubjectRe: [PATCH -mm 2/2] kexec jump -v11: save/restore device state
    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:
    > patches:
    > binary:
    > - 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:
    > patches:
    > binary:
    > - 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:
    > 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_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.


     \ /
      Last update: 2008-06-11 18:37    [W:0.048 / U:6.500 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site