Commit c6c40533 authored by Kairui Song's avatar Kairui Song Committed by Linus Torvalds

vmcore: add a kernel parameter novmcoredd

Since commit 2724273e ("vmcore: add API to collect hardware dump in
second kernel"), drivers are allowed to add device related dump data to
vmcore as they want by using the device dump API.  This has a potential
issue, the data is stored in memory, drivers may append too much data
and use too much memory.  The vmcore is typically used in a kdump kernel
which runs in a pre-reserved small chunk of memory.  So as a result it
will make kdump unusable at all due to OOM issues.

So introduce new 'novmcoredd' command line option.  User can disable
device dump to reduce memory usage.  This is helpful if device dump is
using too much memory, disabling device dump could make sure a regular
vmcore without device dump data is still available.

[akpm@linux-foundation.org: tweak documentation]
[akpm@linux-foundation.org: vmcore.c needs moduleparam.h]
Link: http://lkml.kernel.org/r/20190528111856.7276-1-kasong@redhat.comSigned-off-by: default avatarKairui Song <kasong@redhat.com>
Acked-by: default avatarDave Young <dyoung@redhat.com>
Reviewed-by: default avatarBhupesh Sharma <bhsharma@redhat.com>
Cc: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Cc: "David S . Miller" <davem@davemloft.net>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Baoquan He <bhe@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent bca1eac5
...@@ -2877,6 +2877,17 @@ ...@@ -2877,6 +2877,17 @@
/sys/module/printk/parameters/console_suspend) to /sys/module/printk/parameters/console_suspend) to
turn on/off it dynamically. turn on/off it dynamically.
novmcoredd [KNL,KDUMP]
Disable device dump. Device dump allows drivers to
append dump data to vmcore so you can collect driver
specified debug info. Drivers can append the data
without any limit and this data is stored in memory,
so this may cause significant memory stress. Disabling
device dump can help save memory but the driver debug
data will be no longer available. This parameter
is only available when CONFIG_PROC_VMCORE_DEVICE_DUMP
is set.
noaliencache [MM, NUMA, SLAB] Disables the allocation of alien noaliencache [MM, NUMA, SLAB] Disables the allocation of alien
caches in the slab allocator. Saves per-node memory, caches in the slab allocator. Saves per-node memory,
but will impact performance. but will impact performance.
......
...@@ -58,7 +58,8 @@ config PROC_VMCORE_DEVICE_DUMP ...@@ -58,7 +58,8 @@ config PROC_VMCORE_DEVICE_DUMP
snapshot. snapshot.
If you say Y here, the collected device dumps will be added If you say Y here, the collected device dumps will be added
as ELF notes to /proc/vmcore. as ELF notes to /proc/vmcore. You can still disable device
dump using the kernel command line option 'novmcoredd'.
config PROC_SYSCTL config PROC_SYSCTL
bool "Sysctl support (/proc/sys)" if EXPERT bool "Sysctl support (/proc/sys)" if EXPERT
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/crash_dump.h> #include <linux/crash_dump.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/moduleparam.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
...@@ -54,6 +55,9 @@ static struct proc_dir_entry *proc_vmcore; ...@@ -54,6 +55,9 @@ static struct proc_dir_entry *proc_vmcore;
/* Device Dump list and mutex to synchronize access to list */ /* Device Dump list and mutex to synchronize access to list */
static LIST_HEAD(vmcoredd_list); static LIST_HEAD(vmcoredd_list);
static DEFINE_MUTEX(vmcoredd_mutex); static DEFINE_MUTEX(vmcoredd_mutex);
static bool vmcoredd_disabled;
core_param(novmcoredd, vmcoredd_disabled, bool, 0);
#endif /* CONFIG_PROC_VMCORE_DEVICE_DUMP */ #endif /* CONFIG_PROC_VMCORE_DEVICE_DUMP */
/* Device Dump Size */ /* Device Dump Size */
...@@ -1452,6 +1456,11 @@ int vmcore_add_device_dump(struct vmcoredd_data *data) ...@@ -1452,6 +1456,11 @@ int vmcore_add_device_dump(struct vmcoredd_data *data)
size_t data_size; size_t data_size;
int ret; int ret;
if (vmcoredd_disabled) {
pr_err_once("Device dump is disabled\n");
return -EINVAL;
}
if (!data || !strlen(data->dump_name) || if (!data || !strlen(data->dump_name) ||
!data->vmcoredd_callback || !data->size) !data->vmcoredd_callback || !data->size)
return -EINVAL; return -EINVAL;
......
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