| From beb764ac03e52eba1a654afb4273fab1f9de3cff Mon Sep 17 00:00:00 2001 |
| From: Kyle McMartin <kyle@mcmartin.ca> |
| Date: Mon, 29 Nov 2010 20:59:14 -0500 |
| Subject: [PATCH] linux-2.6-debug-vm-would_have_oomkilled |
| |
| |
| include/linux/oom.h | 1 + |
| kernel/sysctl.c | 7 +++++++ |
| mm/oom_kill.c | 8 ++++++++ |
| 3 files changed, 16 insertions(+), 0 deletions(-) |
| |
| diff --git a/include/linux/oom.h b/include/linux/oom.h |
| index 5e3aa83..79a27b4 100644 |
| |
| |
| @@ -72,5 +72,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_would_have_oomkilled; |
| #endif /* __KERNEL__*/ |
| #endif /* _INCLUDE_LINUX_OOM_H */ |
| diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
| index 5abfa15..a0fed6d 100644 |
| |
| |
| @@ -1000,6 +1000,13 @@ static struct ctl_table vm_table[] = { |
| .proc_handler = proc_dointvec, |
| }, |
| { |
| + .procname = "would_have_oomkilled", |
| + .data = &sysctl_would_have_oomkilled, |
| + .maxlen = sizeof(sysctl_would_have_oomkilled), |
| + .mode = 0644, |
| + .proc_handler = proc_dointvec, |
| + }, |
| + { |
| .procname = "overcommit_ratio", |
| .data = &sysctl_overcommit_ratio, |
| .maxlen = sizeof(sysctl_overcommit_ratio), |
| diff --git a/mm/oom_kill.c b/mm/oom_kill.c |
| index 7dcca55..281ac39 100644 |
| |
| |
| @@ -35,6 +35,7 @@ |
| int sysctl_panic_on_oom; |
| int sysctl_oom_kill_allocating_task; |
| int sysctl_oom_dump_tasks = 1; |
| +int sysctl_would_have_oomkilled; |
| static DEFINE_SPINLOCK(zone_scan_lock); |
| |
| #ifdef CONFIG_NUMA |
| @@ -477,6 +478,13 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, |
| } |
| |
| task_lock(p); |
| + if (sysctl_would_have_oomkilled) { |
| + printk(KERN_ERR "%s: would have killed process %d (%s), but continuing instead...\n", |
| + __func__, task_pid_nr(p), p->comm); |
| + task_unlock(p); |
| + return 0; |
| + } |
| + |
| pr_err("%s: Kill process %d (%s) score %d or sacrifice child\n", |
| message, task_pid_nr(p), p->comm, points); |
| task_unlock(p); |
| -- |
| 1.7.3.2 |
| |