diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2006-02-17 16:20:30 -0500 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2006-02-17 16:20:30 -0500 |
| commit | b04a92e1601eb6df3a3b6599e7fb7ee021eef2cb (patch) | |
| tree | f190980d5bffae81a67c0cea0d913ed2444ceb0c /init/initramfs.c | |
| parent | 70c07e02625ec46d0ffbfce1acef42d660803528 (diff) | |
| parent | f5e2a7b22e7d7dfda8794906d0fddeaaa09bb944 (diff) | |
Merge branch 'upstream-fixes'
Diffstat (limited to 'init/initramfs.c')
| -rw-r--r-- | init/initramfs.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/init/initramfs.c b/init/initramfs.c index 0c5d9a3f951b..637344b05981 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -466,10 +466,32 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only) extern char __initramfs_start[], __initramfs_end[]; #ifdef CONFIG_BLK_DEV_INITRD #include <linux/initrd.h> +#include <linux/kexec.h> static void __init free_initrd(void) { - free_initrd_mem(initrd_start, initrd_end); +#ifdef CONFIG_KEXEC + unsigned long crashk_start = (unsigned long)__va(crashk_res.start); + unsigned long crashk_end = (unsigned long)__va(crashk_res.end); + + /* + * If the initrd region is overlapped with crashkernel reserved region, + * free only memory that is not part of crashkernel region. + */ + if (initrd_start < crashk_end && initrd_end > crashk_start) { + /* + * Initialize initrd memory region since the kexec boot does + * not do. + */ + memset((void *)initrd_start, 0, initrd_end - initrd_start); + if (initrd_start < crashk_start) + free_initrd_mem(initrd_start, crashk_start); + if (initrd_end > crashk_end) + free_initrd_mem(crashk_end, initrd_end); + } else +#endif + free_initrd_mem(initrd_start, initrd_end); + initrd_start = 0; initrd_end = 0; } |
