70 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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
 | |
| --- a/include/linux/oom.h
 | |
| +++ b/include/linux/oom.h
 | |
| @@ -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
 | |
| --- a/kernel/sysctl.c
 | |
| +++ b/kernel/sysctl.c
 | |
| @@ -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
 | |
| --- a/mm/oom_kill.c
 | |
| +++ b/mm/oom_kill.c
 | |
| @@ -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
 | |
| 
 |