Commit 6480e5a0 authored by Michael Holzheu's avatar Michael Holzheu Committed by Linus Torvalds

kdump: add missing RAM resource in crash_shrink_memory()

When shrinking crashkernel memory using /sys/kernel/kexec_crash_size for
the newly added memory no RAM resource is created at the moment.

Example:

  $ cat /proc/iomem
  00000000-bfffffff : System RAM
    00000000-005b7ac3 : Kernel code
    005b7ac4-009743bf : Kernel data
    009bb000-00a85c33 : Kernel bss
  c0000000-cfffffff : Crash kernel
  d0000000-ffffffff : System RAM

  $ echo 0 > /sys/kernel/kexec_crash_size
  $ cat /proc/iomem
  00000000-bfffffff : System RAM
    00000000-005b7ac3 : Kernel code
    005b7ac4-009743bf : Kernel data
    009bb000-00a85c33 : Kernel bss
                                   <<-- here is System RAM missing
  d0000000-ffffffff : System RAM

One result of this bug is that the memory chunk can never be set offline
using memory hotplug.  With this patch I insert a new "System RAM"
resource for the released memory.  Then the upper example looks like the
following:

  $ echo 0 > /sys/kernel/kexec_crash_size
  $ cat /proc/iomem
  00000000-bfffffff : System RAM
    00000000-005b7ac3 : Kernel code
    005b7ac4-009743bf : Kernel data
    009bb000-00a85c33 : Kernel bss
  c0000000-cfffffff : System RAM   <<-- new rescoure
  d0000000-ffffffff : System RAM

And now I can set chunk c0000000-cfffffff offline.
Signed-off-by: default avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent a3dd3323
...@@ -1129,6 +1129,7 @@ int crash_shrink_memory(unsigned long new_size) ...@@ -1129,6 +1129,7 @@ int crash_shrink_memory(unsigned long new_size)
{ {
int ret = 0; int ret = 0;
unsigned long start, end; unsigned long start, end;
struct resource *ram_res;
mutex_lock(&kexec_mutex); mutex_lock(&kexec_mutex);
...@@ -1146,6 +1147,12 @@ int crash_shrink_memory(unsigned long new_size) ...@@ -1146,6 +1147,12 @@ int crash_shrink_memory(unsigned long new_size)
goto unlock; goto unlock;
} }
ram_res = kzalloc(sizeof(*ram_res), GFP_KERNEL);
if (!ram_res) {
ret = -ENOMEM;
goto unlock;
}
start = roundup(start, KEXEC_CRASH_MEM_ALIGN); start = roundup(start, KEXEC_CRASH_MEM_ALIGN);
end = roundup(start + new_size, KEXEC_CRASH_MEM_ALIGN); end = roundup(start + new_size, KEXEC_CRASH_MEM_ALIGN);
...@@ -1154,7 +1161,15 @@ int crash_shrink_memory(unsigned long new_size) ...@@ -1154,7 +1161,15 @@ int crash_shrink_memory(unsigned long new_size)
if ((start == end) && (crashk_res.parent != NULL)) if ((start == end) && (crashk_res.parent != NULL))
release_resource(&crashk_res); release_resource(&crashk_res);
ram_res->start = end;
ram_res->end = crashk_res.end;
ram_res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
ram_res->name = "System RAM";
crashk_res.end = end - 1; crashk_res.end = end - 1;
insert_resource(&iomem_resource, ram_res);
crash_unmap_reserved_pages(); crash_unmap_reserved_pages();
unlock: unlock:
......
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