diff options
Diffstat (limited to 'kernel/kexec_file.c')
| -rw-r--r-- | kernel/kexec_file.c | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index bef2f6f2571b..2d1db05fbf04 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -285,11 +285,13 @@ kimage_file_alloc_init(struct kimage **rimage, int kernel_fd,  	kexec_file_dbg_print = !!(flags & KEXEC_FILE_DEBUG);  	image->file_mode = 1; +#ifdef CONFIG_CRASH_DUMP  	if (kexec_on_panic) {  		/* Enable special crash kernel control page alloc policy. */  		image->control_page = crashk_res.start;  		image->type = KEXEC_TYPE_CRASH;  	} +#endif  	ret = kimage_file_prepare_segments(image, kernel_fd, initrd_fd,  					   cmdline_ptr, cmdline_len, flags); @@ -349,13 +351,14 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,  	if (!kexec_trylock())  		return -EBUSY; +#ifdef CONFIG_CRASH_DUMP  	if (image_type == KEXEC_TYPE_CRASH) {  		dest_image = &kexec_crash_image;  		if (kexec_crash_image)  			arch_kexec_unprotect_crashkres(); -	} else { +	} else +#endif  		dest_image = &kexec_image; -	}  	if (flags & KEXEC_FILE_UNLOAD)  		goto exchange; @@ -419,8 +422,10 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,  exchange:  	image = xchg(dest_image, image);  out: +#ifdef CONFIG_CRASH_DUMP  	if ((flags & KEXEC_FILE_ON_CRASH) && kexec_crash_image)  		arch_kexec_protect_crashkres(); +#endif  	kexec_unlock();  	kimage_free(image); @@ -535,8 +540,10 @@ static int kexec_walk_memblock(struct kexec_buf *kbuf,  	phys_addr_t mstart, mend;  	struct resource res = { }; +#ifdef CONFIG_CRASH_DUMP  	if (kbuf->image->type == KEXEC_TYPE_CRASH)  		return func(&crashk_res, kbuf); +#endif  	/*  	 * Using MEMBLOCK_NONE will properly skip MEMBLOCK_DRIVER_MANAGED. See @@ -595,12 +602,14 @@ static int kexec_walk_memblock(struct kexec_buf *kbuf,  static int kexec_walk_resources(struct kexec_buf *kbuf,  				int (*func)(struct resource *, void *))  { +#ifdef CONFIG_CRASH_DUMP  	if (kbuf->image->type == KEXEC_TYPE_CRASH)  		return walk_iomem_res_desc(crashk_res.desc,  					   IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY,  					   crashk_res.start, crashk_res.end,  					   kbuf, func); -	else if (kbuf->top_down) +#endif +	if (kbuf->top_down)  		return walk_system_ram_res_rev(0, ULONG_MAX, kbuf, func);  	else  		return walk_system_ram_res(0, ULONG_MAX, kbuf, func);  |