Commit e05bd336 authored by Pavan Naregundi's avatar Pavan Naregundi Committed by Linus Torvalds

kexec: fix Oops in crash_shrink_memory()

When crashkernel is not enabled, "echo 0 > /sys/kernel/kexec_crash_size"
OOPSes the kernel in crash_shrink_memory.  This happens when
crash_shrink_memory tries to release the 'crashk_res' resource which are
not reserved.  Also value of "/sys/kernel/kexec_crash_size" shows as 1,
which should be 0.

This patch fixes the OOPS in crash_shrink_memory and shows
"/sys/kernel/kexec_crash_size" as 0 when crash kernel memory is not
reserved.
Signed-off-by: default avatarPavan Naregundi <pavan@linux.vnet.ibm.com>
Reviewed-by: default avatarWANG Cong <xiyou.wangcong@gmail.com>
Cc: Simon Horman <horms@verge.net.au>
Cc: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 482ce512
...@@ -1089,9 +1089,10 @@ void crash_kexec(struct pt_regs *regs) ...@@ -1089,9 +1089,10 @@ void crash_kexec(struct pt_regs *regs)
size_t crash_get_memory_size(void) size_t crash_get_memory_size(void)
{ {
size_t size; size_t size = 0;
mutex_lock(&kexec_mutex); mutex_lock(&kexec_mutex);
size = crashk_res.end - crashk_res.start + 1; if (crashk_res.end != crashk_res.start)
size = crashk_res.end - crashk_res.start + 1;
mutex_unlock(&kexec_mutex); mutex_unlock(&kexec_mutex);
return size; return size;
} }
...@@ -1134,7 +1135,7 @@ int crash_shrink_memory(unsigned long new_size) ...@@ -1134,7 +1135,7 @@ int crash_shrink_memory(unsigned long new_size)
free_reserved_phys_range(end, crashk_res.end); free_reserved_phys_range(end, crashk_res.end);
if (start == end) if ((start == end) && (crashk_res.parent != NULL))
release_resource(&crashk_res); release_resource(&crashk_res);
crashk_res.end = end - 1; crashk_res.end = end - 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment