oom: remove deprecated oom_adj
The deprecated /proc/<pid>/oom_adj is scheduled for removal this month. Signed-off-by: Davidlohr Bueso <dave@gnu.org> Acked-by: David Rientjes <rientjes@google.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
					parent
					
						
							
								d5dc0ad928
							
						
					
				
			
			
				commit
				
					
						01dc52ebdf
					
				
			
		
					 7 changed files with 7 additions and 171 deletions
				
			
		|  | @ -1,22 +0,0 @@ | ||||||
| What:	/proc/<pid>/oom_adj |  | ||||||
| When:	August 2012 |  | ||||||
| Why:	/proc/<pid>/oom_adj allows userspace to influence the oom killer's |  | ||||||
| 	badness heuristic used to determine which task to kill when the kernel |  | ||||||
| 	is out of memory. |  | ||||||
| 
 |  | ||||||
| 	The badness heuristic has since been rewritten since the introduction of |  | ||||||
| 	this tunable such that its meaning is deprecated.  The value was |  | ||||||
| 	implemented as a bitshift on a score generated by the badness() |  | ||||||
| 	function that did not have any precise units of measure.  With the |  | ||||||
| 	rewrite, the score is given as a proportion of available memory to the |  | ||||||
| 	task allocating pages, so using a bitshift which grows the score |  | ||||||
| 	exponentially is, thus, impossible to tune with fine granularity. |  | ||||||
| 
 |  | ||||||
| 	A much more powerful interface, /proc/<pid>/oom_score_adj, was |  | ||||||
| 	introduced with the oom killer rewrite that allows users to increase or |  | ||||||
| 	decrease the badness score linearly.  This interface will replace |  | ||||||
| 	/proc/<pid>/oom_adj. |  | ||||||
| 
 |  | ||||||
| 	A warning will be emitted to the kernel log if an application uses this |  | ||||||
| 	deprecated interface.  After it is printed once, future warnings will be |  | ||||||
| 	suppressed until the kernel is rebooted. |  | ||||||
|  | @ -33,7 +33,7 @@ Table of Contents | ||||||
|   2	Modifying System Parameters |   2	Modifying System Parameters | ||||||
| 
 | 
 | ||||||
|   3	Per-Process Parameters |   3	Per-Process Parameters | ||||||
|   3.1	/proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj - Adjust the oom-killer |   3.1	/proc/<pid>/oom_score_adj - Adjust the oom-killer | ||||||
| 								score | 								score | ||||||
|   3.2	/proc/<pid>/oom_score - Display current oom-killer score |   3.2	/proc/<pid>/oom_score - Display current oom-killer score | ||||||
|   3.3	/proc/<pid>/io - Display the IO accounting fields |   3.3	/proc/<pid>/io - Display the IO accounting fields | ||||||
|  | @ -1320,10 +1320,10 @@ of the kernel. | ||||||
| CHAPTER 3: PER-PROCESS PARAMETERS | CHAPTER 3: PER-PROCESS PARAMETERS | ||||||
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ||||||
| 
 | 
 | ||||||
| 3.1 /proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj- Adjust the oom-killer score | 3.1 /proc/<pid>/oom_score_adj- Adjust the oom-killer score | ||||||
| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| These file can be used to adjust the badness heuristic used to select which | This file can be used to adjust the badness heuristic used to select which | ||||||
| process gets killed in out of memory conditions. | process gets killed in out of memory conditions. | ||||||
| 
 | 
 | ||||||
| The badness heuristic assigns a value to each candidate task ranging from 0 | The badness heuristic assigns a value to each candidate task ranging from 0 | ||||||
|  | @ -1361,22 +1361,10 @@ same system, cpuset, mempolicy, or memory controller resources to use at least | ||||||
| equivalent to discounting 50% of the task's allowed memory from being considered | equivalent to discounting 50% of the task's allowed memory from being considered | ||||||
| as scoring against the task. | as scoring against the task. | ||||||
| 
 | 
 | ||||||
| For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also |  | ||||||
| be used to tune the badness score.  Its acceptable values range from -16 |  | ||||||
| (OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17 |  | ||||||
| (OOM_DISABLE) to disable oom killing entirely for that task.  Its value is |  | ||||||
| scaled linearly with /proc/<pid>/oom_score_adj. |  | ||||||
| 
 |  | ||||||
| Writing to /proc/<pid>/oom_score_adj or /proc/<pid>/oom_adj will change the |  | ||||||
| other with its scaled value. |  | ||||||
| 
 |  | ||||||
| The value of /proc/<pid>/oom_score_adj may be reduced no lower than the last | The value of /proc/<pid>/oom_score_adj may be reduced no lower than the last | ||||||
| value set by a CAP_SYS_RESOURCE process. To reduce the value any lower | value set by a CAP_SYS_RESOURCE process. To reduce the value any lower | ||||||
| requires CAP_SYS_RESOURCE. | requires CAP_SYS_RESOURCE. | ||||||
| 
 | 
 | ||||||
| NOTICE: /proc/<pid>/oom_adj is deprecated and will be removed, please see |  | ||||||
| Documentation/feature-removal-schedule.txt. |  | ||||||
| 
 |  | ||||||
| Caveat: when a parent task is selected, the oom killer will sacrifice any first | Caveat: when a parent task is selected, the oom killer will sacrifice any first | ||||||
| generation children with separate address spaces instead, if possible.  This | generation children with separate address spaces instead, if possible.  This | ||||||
| avoids servers and important system daemons from being killed and loses the | avoids servers and important system daemons from being killed and loses the | ||||||
|  | @ -1387,9 +1375,7 @@ minimal amount of work. | ||||||
| ------------------------------------------------------------- | ------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| This file can be used to check the current score used by the oom-killer is for | This file can be used to check the current score used by the oom-killer is for | ||||||
| any given <pid>. Use it together with /proc/<pid>/oom_adj to tune which | any given <pid>. | ||||||
| process should be killed in an out-of-memory situation. |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| 3.3  /proc/<pid>/io - Display the IO accounting fields | 3.3  /proc/<pid>/io - Display the IO accounting fields | ||||||
| ------------------------------------------------------- | ------------------------------------------------------- | ||||||
|  |  | ||||||
							
								
								
									
										117
									
								
								fs/proc/base.c
									
										
									
									
									
								
							
							
						
						
									
										117
									
								
								fs/proc/base.c
									
										
									
									
									
								
							|  | @ -873,111 +873,6 @@ static const struct file_operations proc_environ_operations = { | ||||||
| 	.release	= mem_release, | 	.release	= mem_release, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static ssize_t oom_adjust_read(struct file *file, char __user *buf, |  | ||||||
| 				size_t count, loff_t *ppos) |  | ||||||
| { |  | ||||||
| 	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); |  | ||||||
| 	char buffer[PROC_NUMBUF]; |  | ||||||
| 	size_t len; |  | ||||||
| 	int oom_adjust = OOM_DISABLE; |  | ||||||
| 	unsigned long flags; |  | ||||||
| 
 |  | ||||||
| 	if (!task) |  | ||||||
| 		return -ESRCH; |  | ||||||
| 
 |  | ||||||
| 	if (lock_task_sighand(task, &flags)) { |  | ||||||
| 		oom_adjust = task->signal->oom_adj; |  | ||||||
| 		unlock_task_sighand(task, &flags); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	put_task_struct(task); |  | ||||||
| 
 |  | ||||||
| 	len = snprintf(buffer, sizeof(buffer), "%i\n", oom_adjust); |  | ||||||
| 
 |  | ||||||
| 	return simple_read_from_buffer(buf, count, ppos, buffer, len); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static ssize_t oom_adjust_write(struct file *file, const char __user *buf, |  | ||||||
| 				size_t count, loff_t *ppos) |  | ||||||
| { |  | ||||||
| 	struct task_struct *task; |  | ||||||
| 	char buffer[PROC_NUMBUF]; |  | ||||||
| 	int oom_adjust; |  | ||||||
| 	unsigned long flags; |  | ||||||
| 	int err; |  | ||||||
| 
 |  | ||||||
| 	memset(buffer, 0, sizeof(buffer)); |  | ||||||
| 	if (count > sizeof(buffer) - 1) |  | ||||||
| 		count = sizeof(buffer) - 1; |  | ||||||
| 	if (copy_from_user(buffer, buf, count)) { |  | ||||||
| 		err = -EFAULT; |  | ||||||
| 		goto out; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = kstrtoint(strstrip(buffer), 0, &oom_adjust); |  | ||||||
| 	if (err) |  | ||||||
| 		goto out; |  | ||||||
| 	if ((oom_adjust < OOM_ADJUST_MIN || oom_adjust > OOM_ADJUST_MAX) && |  | ||||||
| 	     oom_adjust != OOM_DISABLE) { |  | ||||||
| 		err = -EINVAL; |  | ||||||
| 		goto out; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	task = get_proc_task(file->f_path.dentry->d_inode); |  | ||||||
| 	if (!task) { |  | ||||||
| 		err = -ESRCH; |  | ||||||
| 		goto out; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	task_lock(task); |  | ||||||
| 	if (!task->mm) { |  | ||||||
| 		err = -EINVAL; |  | ||||||
| 		goto err_task_lock; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (!lock_task_sighand(task, &flags)) { |  | ||||||
| 		err = -ESRCH; |  | ||||||
| 		goto err_task_lock; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (oom_adjust < task->signal->oom_adj && !capable(CAP_SYS_RESOURCE)) { |  | ||||||
| 		err = -EACCES; |  | ||||||
| 		goto err_sighand; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * Warn that /proc/pid/oom_adj is deprecated, see |  | ||||||
| 	 * Documentation/feature-removal-schedule.txt. |  | ||||||
| 	 */ |  | ||||||
| 	printk_once(KERN_WARNING "%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n", |  | ||||||
| 		  current->comm, task_pid_nr(current), task_pid_nr(task), |  | ||||||
| 		  task_pid_nr(task)); |  | ||||||
| 	task->signal->oom_adj = oom_adjust; |  | ||||||
| 	/*
 |  | ||||||
| 	 * Scale /proc/pid/oom_score_adj appropriately ensuring that a maximum |  | ||||||
| 	 * value is always attainable. |  | ||||||
| 	 */ |  | ||||||
| 	if (task->signal->oom_adj == OOM_ADJUST_MAX) |  | ||||||
| 		task->signal->oom_score_adj = OOM_SCORE_ADJ_MAX; |  | ||||||
| 	else |  | ||||||
| 		task->signal->oom_score_adj = (oom_adjust * OOM_SCORE_ADJ_MAX) / |  | ||||||
| 								-OOM_DISABLE; |  | ||||||
| 	trace_oom_score_adj_update(task); |  | ||||||
| err_sighand: |  | ||||||
| 	unlock_task_sighand(task, &flags); |  | ||||||
| err_task_lock: |  | ||||||
| 	task_unlock(task); |  | ||||||
| 	put_task_struct(task); |  | ||||||
| out: |  | ||||||
| 	return err < 0 ? err : count; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static const struct file_operations proc_oom_adjust_operations = { |  | ||||||
| 	.read		= oom_adjust_read, |  | ||||||
| 	.write		= oom_adjust_write, |  | ||||||
| 	.llseek		= generic_file_llseek, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static ssize_t oom_score_adj_read(struct file *file, char __user *buf, | static ssize_t oom_score_adj_read(struct file *file, char __user *buf, | ||||||
| 					size_t count, loff_t *ppos) | 					size_t count, loff_t *ppos) | ||||||
| { | { | ||||||
|  | @ -1051,15 +946,7 @@ static ssize_t oom_score_adj_write(struct file *file, const char __user *buf, | ||||||
| 	if (has_capability_noaudit(current, CAP_SYS_RESOURCE)) | 	if (has_capability_noaudit(current, CAP_SYS_RESOURCE)) | ||||||
| 		task->signal->oom_score_adj_min = oom_score_adj; | 		task->signal->oom_score_adj_min = oom_score_adj; | ||||||
| 	trace_oom_score_adj_update(task); | 	trace_oom_score_adj_update(task); | ||||||
| 	/*
 | 
 | ||||||
| 	 * Scale /proc/pid/oom_adj appropriately ensuring that OOM_DISABLE is |  | ||||||
| 	 * always attainable. |  | ||||||
| 	 */ |  | ||||||
| 	if (task->signal->oom_score_adj == OOM_SCORE_ADJ_MIN) |  | ||||||
| 		task->signal->oom_adj = OOM_DISABLE; |  | ||||||
| 	else |  | ||||||
| 		task->signal->oom_adj = (oom_score_adj * OOM_ADJUST_MAX) / |  | ||||||
| 							OOM_SCORE_ADJ_MAX; |  | ||||||
| err_sighand: | err_sighand: | ||||||
| 	unlock_task_sighand(task, &flags); | 	unlock_task_sighand(task, &flags); | ||||||
| err_task_lock: | err_task_lock: | ||||||
|  | @ -2710,7 +2597,6 @@ static const struct pid_entry tgid_base_stuff[] = { | ||||||
| 	REG("cgroup",  S_IRUGO, proc_cgroup_operations), | 	REG("cgroup",  S_IRUGO, proc_cgroup_operations), | ||||||
| #endif | #endif | ||||||
| 	INF("oom_score",  S_IRUGO, proc_oom_score), | 	INF("oom_score",  S_IRUGO, proc_oom_score), | ||||||
| 	REG("oom_adj",    S_IRUGO|S_IWUSR, proc_oom_adjust_operations), |  | ||||||
| 	REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations), | 	REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations), | ||||||
| #ifdef CONFIG_AUDITSYSCALL | #ifdef CONFIG_AUDITSYSCALL | ||||||
| 	REG("loginuid",   S_IWUSR|S_IRUGO, proc_loginuid_operations), | 	REG("loginuid",   S_IWUSR|S_IRUGO, proc_loginuid_operations), | ||||||
|  | @ -3077,7 +2963,6 @@ static const struct pid_entry tid_base_stuff[] = { | ||||||
| 	REG("cgroup",  S_IRUGO, proc_cgroup_operations), | 	REG("cgroup",  S_IRUGO, proc_cgroup_operations), | ||||||
| #endif | #endif | ||||||
| 	INF("oom_score", S_IRUGO, proc_oom_score), | 	INF("oom_score", S_IRUGO, proc_oom_score), | ||||||
| 	REG("oom_adj",   S_IRUGO|S_IWUSR, proc_oom_adjust_operations), |  | ||||||
| 	REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations), | 	REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations), | ||||||
| #ifdef CONFIG_AUDITSYSCALL | #ifdef CONFIG_AUDITSYSCALL | ||||||
| 	REG("loginuid",  S_IWUSR|S_IRUGO, proc_loginuid_operations), | 	REG("loginuid",  S_IWUSR|S_IRUGO, proc_loginuid_operations), | ||||||
|  |  | ||||||
|  | @ -1,17 +1,6 @@ | ||||||
| #ifndef __INCLUDE_LINUX_OOM_H | #ifndef __INCLUDE_LINUX_OOM_H | ||||||
| #define __INCLUDE_LINUX_OOM_H | #define __INCLUDE_LINUX_OOM_H | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * /proc/<pid>/oom_adj is deprecated, see |  | ||||||
|  * Documentation/feature-removal-schedule.txt. |  | ||||||
|  * |  | ||||||
|  * /proc/<pid>/oom_adj set to -17 protects from the oom-killer |  | ||||||
|  */ |  | ||||||
| #define OOM_DISABLE (-17) |  | ||||||
| /* inclusive */ |  | ||||||
| #define OOM_ADJUST_MIN (-16) |  | ||||||
| #define OOM_ADJUST_MAX 15 |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * /proc/<pid>/oom_score_adj set to OOM_SCORE_ADJ_MIN disables oom killing for |  * /proc/<pid>/oom_score_adj set to OOM_SCORE_ADJ_MIN disables oom killing for | ||||||
|  * pid. |  * pid. | ||||||
|  |  | ||||||
|  | @ -671,7 +671,6 @@ struct signal_struct { | ||||||
| 	struct rw_semaphore group_rwsem; | 	struct rw_semaphore group_rwsem; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	int oom_adj;		/* OOM kill score adjustment (bit shift) */ |  | ||||||
| 	int oom_score_adj;	/* OOM kill score adjustment */ | 	int oom_score_adj;	/* OOM kill score adjustment */ | ||||||
| 	int oom_score_adj_min;	/* OOM kill score adjustment minimum value.
 | 	int oom_score_adj_min;	/* OOM kill score adjustment minimum value.
 | ||||||
| 				 * Only settable by CAP_SYS_RESOURCE. */ | 				 * Only settable by CAP_SYS_RESOURCE. */ | ||||||
|  |  | ||||||
|  | @ -1056,7 +1056,6 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) | ||||||
| 	init_rwsem(&sig->group_rwsem); | 	init_rwsem(&sig->group_rwsem); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	sig->oom_adj = current->signal->oom_adj; |  | ||||||
| 	sig->oom_score_adj = current->signal->oom_score_adj; | 	sig->oom_score_adj = current->signal->oom_score_adj; | ||||||
| 	sig->oom_score_adj_min = current->signal->oom_score_adj_min; | 	sig->oom_score_adj_min = current->signal->oom_score_adj_min; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -428,8 +428,8 @@ static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order, | ||||||
| { | { | ||||||
| 	task_lock(current); | 	task_lock(current); | ||||||
| 	pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, " | 	pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, " | ||||||
| 		"oom_adj=%d, oom_score_adj=%d\n", | 		"oom_score_adj=%d\n", | ||||||
| 		current->comm, gfp_mask, order, current->signal->oom_adj, | 		current->comm, gfp_mask, order, | ||||||
| 		current->signal->oom_score_adj); | 		current->signal->oom_score_adj); | ||||||
| 	cpuset_print_task_mems_allowed(current); | 	cpuset_print_task_mems_allowed(current); | ||||||
| 	task_unlock(current); | 	task_unlock(current); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Davidlohr Bueso
				Davidlohr Bueso