Add two sysctl entries (vm.oom_dump_ratelimit and vm.oom_dump_ratelimit_burst) to control the rate limiting interval and burst, respectively, of the OOM killer output (oom_kill_process()). These entries are disabled by default and can be enabled during kernel configuration with CONFIG_DUMP_RATELIMIT. They take DEFAULT_RATELIMIT_INTERVAL and DEFAULT_RATELIMIT_BURST as their default values. Signed-off-by: Ricardo Cañuelo <ricardo.canuelo@xxxxxxxxxxxxx> --- In some setups, the amount of output that the OOM killer generates when it kills a process and dumps the list of tasks can be too large. Unfortunately, the rate-limiting used for it uses the default values for the rate limit interval and burst. This patch allows the user to configure these values. I created a new menu selection inside "printk and dmesg options" for this option. Many other parts of the kernel use either hardcoded or default values for the rate limiting parameters. If, in the future, more of these cases need to be parameterized, this new submenu can be used to hold any new config option related to rate limiting. include/linux/oom.h | 2 ++ kernel/sysctl.c | 16 ++++++++++++++++ lib/Kconfig.debug | 13 +++++++++++++ mm/oom_kill.c | 5 +++++ 4 files changed, 36 insertions(+) diff --git a/include/linux/oom.h b/include/linux/oom.h index 2db9a1432511..76c560a1a4c7 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -127,4 +127,6 @@ extern struct task_struct *find_lock_task_mm(struct task_struct *p); extern int sysctl_oom_dump_tasks; extern int sysctl_oom_kill_allocating_task; extern int sysctl_panic_on_oom; +extern int sysctl_oom_dump_ratelimit; +extern int sysctl_oom_dump_ratelimit_burst; #endif /* _INCLUDE_LINUX_OOM_H */ diff --git a/kernel/sysctl.c b/kernel/sysctl.c index ce75c67572b9..d348eac7e561 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -2708,6 +2708,22 @@ static struct ctl_table vm_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, +#ifdef CONFIG_OOM_DUMP_RATELIMIT + { + .procname = "oom_dump_ratelimit", + .data = &sysctl_oom_dump_ratelimit, + .maxlen = sizeof(sysctl_oom_dump_ratelimit), + .mode = 0644, + .proc_handler = proc_dointvec, + }, + { + .procname = "oom_dump_ratelimit_burst", + .data = &sysctl_oom_dump_ratelimit_burst, + .maxlen = sizeof(sysctl_oom_dump_ratelimit_burst), + .mode = 0644, + .proc_handler = proc_dointvec, + }, +#endif { .procname = "overcommit_ratio", .data = &sysctl_overcommit_ratio, diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index fde620501707..c57233e56d01 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -195,6 +195,19 @@ config DEBUG_BUGVERBOSE of the BUG call as well as the EIP and oops trace. This aids debugging but costs about 70-100K of memory. +menu "Rate limiting" + +config OOM_DUMP_RATELIMIT + bool "Enable rate limiting for OOM dumps" + default n + help + Say Y here to enable the configuration of the rate limiting of + OOM task dumps to the console through sysctl entries + vm.oom_dump_ratelimit (rate limit interval) and + vm.oom_dump_ratelimit_burst (rate limit burst). + +endmenu # "Rate limiting" + endmenu # "printk and dmesg options" menu "Compile-time checks and compiler options" diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 8b84661a6410..2b3fa826a172 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -54,6 +54,8 @@ int sysctl_panic_on_oom; int sysctl_oom_kill_allocating_task; int sysctl_oom_dump_tasks = 1; +int sysctl_oom_dump_ratelimit = DEFAULT_RATELIMIT_INTERVAL; +int sysctl_oom_dump_ratelimit_burst = DEFAULT_RATELIMIT_BURST; /* * Serializes oom killer invocations (out_of_memory()) from all contexts to @@ -959,6 +961,9 @@ static void oom_kill_process(struct oom_control *oc, const char *message) static DEFINE_RATELIMIT_STATE(oom_rs, DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST); + oom_rs.interval = sysctl_oom_dump_ratelimit; + oom_rs.burst = sysctl_oom_dump_ratelimit_burst; + /* * If the task is already exiting, don't alarm the sysadmin or kill * its children or threads, just give it access to memory reserves -- 2.18.0