Commit fadd8fbd authored by KAMEZAWA Hiroyuki's avatar KAMEZAWA Hiroyuki Committed by Linus Torvalds

[PATCH] support for panic at OOM

This patch adds panic_on_oom sysctl under sys.vm.

When sysctl vm.panic_on_oom = 1, the kernel panics intead of killing rogue
processes.  And if vm.panic_on_oom is 0 the kernel will do oom_kill() in
the same way as it does today.  Of course, the default value is 0 and only
root can modifies it.

In general, oom_killer works well and kill rogue processes.  So the whole
system can survive.  But there are environments where panic is preferable
rather than kill some processes.
Signed-off-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 67de6482
...@@ -29,6 +29,7 @@ Currently, these files are in /proc/sys/vm: ...@@ -29,6 +29,7 @@ Currently, these files are in /proc/sys/vm:
- drop-caches - drop-caches
- zone_reclaim_mode - zone_reclaim_mode
- zone_reclaim_interval - zone_reclaim_interval
- panic_on_oom
============================================================== ==============================================================
...@@ -178,3 +179,15 @@ Time is set in seconds and set by default to 30 seconds. ...@@ -178,3 +179,15 @@ Time is set in seconds and set by default to 30 seconds.
Reduce the interval if undesired off node allocations occur. However, too Reduce the interval if undesired off node allocations occur. However, too
frequent scans will have a negative impact onoff node allocation performance. frequent scans will have a negative impact onoff node allocation performance.
=============================================================
panic_on_oom
This enables or disables panic on out-of-memory feature. If this is set to 1,
the kernel panics when out-of-memory happens. If this is set to 0, the kernel
will kill some rogue process, called oom_killer. Usually, oom_killer can kill
rogue processes and system will survive. If you want to panic the system
rather than killing rogue processes, set this to 1.
The default value is 0.
...@@ -186,6 +186,7 @@ enum ...@@ -186,6 +186,7 @@ enum
VM_PERCPU_PAGELIST_FRACTION=30,/* int: fraction of pages in each percpu_pagelist */ VM_PERCPU_PAGELIST_FRACTION=30,/* int: fraction of pages in each percpu_pagelist */
VM_ZONE_RECLAIM_MODE=31, /* reclaim local zone memory before going off node */ VM_ZONE_RECLAIM_MODE=31, /* reclaim local zone memory before going off node */
VM_ZONE_RECLAIM_INTERVAL=32, /* time period to wait after reclaim failure */ VM_ZONE_RECLAIM_INTERVAL=32, /* time period to wait after reclaim failure */
VM_PANIC_ON_OOM=33, /* panic at out-of-memory */
}; };
......
...@@ -59,6 +59,7 @@ extern int proc_nr_files(ctl_table *table, int write, struct file *filp, ...@@ -59,6 +59,7 @@ extern int proc_nr_files(ctl_table *table, int write, struct file *filp,
extern int C_A_D; extern int C_A_D;
extern int sysctl_overcommit_memory; extern int sysctl_overcommit_memory;
extern int sysctl_overcommit_ratio; extern int sysctl_overcommit_ratio;
extern int sysctl_panic_on_oom;
extern int max_threads; extern int max_threads;
extern int sysrq_enabled; extern int sysrq_enabled;
extern int core_uses_pid; extern int core_uses_pid;
...@@ -701,6 +702,14 @@ static ctl_table vm_table[] = { ...@@ -701,6 +702,14 @@ static ctl_table vm_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{
.ctl_name = VM_PANIC_ON_OOM,
.procname = "panic_on_oom",
.data = &sysctl_panic_on_oom,
.maxlen = sizeof(sysctl_panic_on_oom),
.mode = 0644,
.proc_handler = &proc_dointvec,
},
{ {
.ctl_name = VM_OVERCOMMIT_RATIO, .ctl_name = VM_OVERCOMMIT_RATIO,
.procname = "overcommit_ratio", .procname = "overcommit_ratio",
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/cpuset.h> #include <linux/cpuset.h>
int sysctl_panic_on_oom;
/* #define DEBUG */ /* #define DEBUG */
/** /**
...@@ -344,6 +345,8 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order) ...@@ -344,6 +345,8 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
break; break;
case CONSTRAINT_NONE: case CONSTRAINT_NONE:
if (sysctl_panic_on_oom)
panic("out of memory. panic_on_oom is selected\n");
retry: retry:
/* /*
* Rambo mode: Shoot down a process and hope it solves whatever * Rambo mode: Shoot down a process and hope it solves whatever
......
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