mm, oom: change type of oom_score_adj to short
The maximum oom_score_adj is 1000 and the minimum oom_score_adj is -1000, so this range can be represented by the signed short type with no functional change. The extra space this frees up in struct signal_struct will be used for per-thread oom kill flags in the next patch. Signed-off-by: David Rientjes <rientjes@google.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Reviewed-by: Michal Hocko <mhocko@suse.cz> Cc: Anton Vorontsov <anton.vorontsov@linaro.org> Cc: Oleg Nesterov <oleg@redhat.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
					
						
							
								fa26437517
							
						
					
				
			
			
				commit
				
					
						a9c58b907d
					
				
			
		
					 9 changed files with 31 additions and 31 deletions
				
			
		|  | @ -40,7 +40,7 @@ | ||||||
| #include <linux/notifier.h> | #include <linux/notifier.h> | ||||||
| 
 | 
 | ||||||
| static uint32_t lowmem_debug_level = 2; | static uint32_t lowmem_debug_level = 2; | ||||||
| static int lowmem_adj[6] = { | static short lowmem_adj[6] = { | ||||||
| 	0, | 	0, | ||||||
| 	1, | 	1, | ||||||
| 	6, | 	6, | ||||||
|  | @ -70,9 +70,9 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) | ||||||
| 	int rem = 0; | 	int rem = 0; | ||||||
| 	int tasksize; | 	int tasksize; | ||||||
| 	int i; | 	int i; | ||||||
| 	int min_score_adj = OOM_SCORE_ADJ_MAX + 1; | 	short min_score_adj = OOM_SCORE_ADJ_MAX + 1; | ||||||
| 	int selected_tasksize = 0; | 	int selected_tasksize = 0; | ||||||
| 	int selected_oom_score_adj; | 	short selected_oom_score_adj; | ||||||
| 	int array_size = ARRAY_SIZE(lowmem_adj); | 	int array_size = ARRAY_SIZE(lowmem_adj); | ||||||
| 	int other_free = global_page_state(NR_FREE_PAGES); | 	int other_free = global_page_state(NR_FREE_PAGES); | ||||||
| 	int other_file = global_page_state(NR_FILE_PAGES) - | 	int other_file = global_page_state(NR_FILE_PAGES) - | ||||||
|  | @ -90,7 +90,7 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if (sc->nr_to_scan > 0) | 	if (sc->nr_to_scan > 0) | ||||||
| 		lowmem_print(3, "lowmem_shrink %lu, %x, ofree %d %d, ma %d\n", | 		lowmem_print(3, "lowmem_shrink %lu, %x, ofree %d %d, ma %hd\n", | ||||||
| 				sc->nr_to_scan, sc->gfp_mask, other_free, | 				sc->nr_to_scan, sc->gfp_mask, other_free, | ||||||
| 				other_file, min_score_adj); | 				other_file, min_score_adj); | ||||||
| 	rem = global_page_state(NR_ACTIVE_ANON) + | 	rem = global_page_state(NR_ACTIVE_ANON) + | ||||||
|  | @ -107,7 +107,7 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) | ||||||
| 	rcu_read_lock(); | 	rcu_read_lock(); | ||||||
| 	for_each_process(tsk) { | 	for_each_process(tsk) { | ||||||
| 		struct task_struct *p; | 		struct task_struct *p; | ||||||
| 		int oom_score_adj; | 		short oom_score_adj; | ||||||
| 
 | 
 | ||||||
| 		if (tsk->flags & PF_KTHREAD) | 		if (tsk->flags & PF_KTHREAD) | ||||||
| 			continue; | 			continue; | ||||||
|  | @ -141,11 +141,11 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) | ||||||
| 		selected = p; | 		selected = p; | ||||||
| 		selected_tasksize = tasksize; | 		selected_tasksize = tasksize; | ||||||
| 		selected_oom_score_adj = oom_score_adj; | 		selected_oom_score_adj = oom_score_adj; | ||||||
| 		lowmem_print(2, "select %d (%s), adj %d, size %d, to kill\n", | 		lowmem_print(2, "select %d (%s), adj %hd, size %d, to kill\n", | ||||||
| 			     p->pid, p->comm, oom_score_adj, tasksize); | 			     p->pid, p->comm, oom_score_adj, tasksize); | ||||||
| 	} | 	} | ||||||
| 	if (selected) { | 	if (selected) { | ||||||
| 		lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d\n", | 		lowmem_print(1, "send sigkill to %d (%s), adj %hd, size %d\n", | ||||||
| 			     selected->pid, selected->comm, | 			     selected->pid, selected->comm, | ||||||
| 			     selected_oom_score_adj, selected_tasksize); | 			     selected_oom_score_adj, selected_tasksize); | ||||||
| 		lowmem_deathpending_timeout = jiffies + HZ; | 		lowmem_deathpending_timeout = jiffies + HZ; | ||||||
|  | @ -176,7 +176,7 @@ static void __exit lowmem_exit(void) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| module_param_named(cost, lowmem_shrinker.seeks, int, S_IRUGO | S_IWUSR); | module_param_named(cost, lowmem_shrinker.seeks, int, S_IRUGO | S_IWUSR); | ||||||
| module_param_array_named(adj, lowmem_adj, int, &lowmem_adj_size, | module_param_array_named(adj, lowmem_adj, short, &lowmem_adj_size, | ||||||
| 			 S_IRUGO | S_IWUSR); | 			 S_IRUGO | S_IWUSR); | ||||||
| module_param_array_named(minfree, lowmem_minfree, uint, &lowmem_minfree_size, | module_param_array_named(minfree, lowmem_minfree, uint, &lowmem_minfree_size, | ||||||
| 			 S_IRUGO | S_IWUSR); | 			 S_IRUGO | S_IWUSR); | ||||||
|  |  | ||||||
|  | @ -985,7 +985,7 @@ static ssize_t oom_score_adj_read(struct file *file, char __user *buf, | ||||||
| { | { | ||||||
| 	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); | 	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); | ||||||
| 	char buffer[PROC_NUMBUF]; | 	char buffer[PROC_NUMBUF]; | ||||||
| 	int oom_score_adj = OOM_SCORE_ADJ_MIN; | 	short oom_score_adj = OOM_SCORE_ADJ_MIN; | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 	size_t len; | 	size_t len; | ||||||
| 
 | 
 | ||||||
|  | @ -996,7 +996,7 @@ static ssize_t oom_score_adj_read(struct file *file, char __user *buf, | ||||||
| 		unlock_task_sighand(task, &flags); | 		unlock_task_sighand(task, &flags); | ||||||
| 	} | 	} | ||||||
| 	put_task_struct(task); | 	put_task_struct(task); | ||||||
| 	len = snprintf(buffer, sizeof(buffer), "%d\n", oom_score_adj); | 	len = snprintf(buffer, sizeof(buffer), "%hd\n", oom_score_adj); | ||||||
| 	return simple_read_from_buffer(buf, count, ppos, buffer, len); | 	return simple_read_from_buffer(buf, count, ppos, buffer, len); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1043,15 +1043,15 @@ static ssize_t oom_score_adj_write(struct file *file, const char __user *buf, | ||||||
| 		goto err_task_lock; | 		goto err_task_lock; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (oom_score_adj < task->signal->oom_score_adj_min && | 	if ((short)oom_score_adj < task->signal->oom_score_adj_min && | ||||||
| 			!capable(CAP_SYS_RESOURCE)) { | 			!capable(CAP_SYS_RESOURCE)) { | ||||||
| 		err = -EACCES; | 		err = -EACCES; | ||||||
| 		goto err_sighand; | 		goto err_sighand; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	task->signal->oom_score_adj = oom_score_adj; | 	task->signal->oom_score_adj = (short)oom_score_adj; | ||||||
| 	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 = (short)oom_score_adj; | ||||||
| 	trace_oom_score_adj_update(task); | 	trace_oom_score_adj_update(task); | ||||||
| 
 | 
 | ||||||
| err_sighand: | err_sighand: | ||||||
|  |  | ||||||
|  | @ -29,8 +29,8 @@ enum oom_scan_t { | ||||||
| 	OOM_SCAN_SELECT,	/* always select this thread first */ | 	OOM_SCAN_SELECT,	/* always select this thread first */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| extern void compare_swap_oom_score_adj(int old_val, int new_val); | extern void compare_swap_oom_score_adj(short old_val, short new_val); | ||||||
| extern int test_set_oom_score_adj(int new_val); | extern short test_set_oom_score_adj(short new_val); | ||||||
| 
 | 
 | ||||||
| extern unsigned long oom_badness(struct task_struct *p, | extern unsigned long oom_badness(struct task_struct *p, | ||||||
| 		struct mem_cgroup *memcg, const nodemask_t *nodemask, | 		struct mem_cgroup *memcg, const nodemask_t *nodemask, | ||||||
|  |  | ||||||
|  | @ -631,8 +631,8 @@ struct signal_struct { | ||||||
| 	struct rw_semaphore group_rwsem; | 	struct rw_semaphore group_rwsem; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	int oom_score_adj;	/* OOM kill score adjustment */ | 	short oom_score_adj;		/* OOM kill score adjustment */ | ||||||
| 	int oom_score_adj_min;	/* OOM kill score adjustment minimum value.
 | 	short oom_score_adj_min;	/* OOM kill score adjustment min value.
 | ||||||
| 					 * Only settable by CAP_SYS_RESOURCE. */ | 					 * Only settable by CAP_SYS_RESOURCE. */ | ||||||
| 
 | 
 | ||||||
| 	struct mutex cred_guard_mutex;	/* guard against foreign influences on
 | 	struct mutex cred_guard_mutex;	/* guard against foreign influences on
 | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ TRACE_EVENT(oom_score_adj_update, | ||||||
| 	TP_STRUCT__entry( | 	TP_STRUCT__entry( | ||||||
| 		__field(	pid_t,	pid) | 		__field(	pid_t,	pid) | ||||||
| 		__array(	char,	comm,	TASK_COMM_LEN ) | 		__array(	char,	comm,	TASK_COMM_LEN ) | ||||||
| 		__field(	 int,	oom_score_adj) | 		__field(	short,	oom_score_adj) | ||||||
| 	), | 	), | ||||||
| 
 | 
 | ||||||
| 	TP_fast_assign( | 	TP_fast_assign( | ||||||
|  | @ -23,7 +23,7 @@ TRACE_EVENT(oom_score_adj_update, | ||||||
| 		__entry->oom_score_adj = task->signal->oom_score_adj; | 		__entry->oom_score_adj = task->signal->oom_score_adj; | ||||||
| 	), | 	), | ||||||
| 
 | 
 | ||||||
| 	TP_printk("pid=%d comm=%s oom_score_adj=%d", | 	TP_printk("pid=%d comm=%s oom_score_adj=%hd", | ||||||
| 		__entry->pid, __entry->comm, __entry->oom_score_adj) | 		__entry->pid, __entry->comm, __entry->oom_score_adj) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ TRACE_EVENT(task_newtask, | ||||||
| 		__field(	pid_t,	pid) | 		__field(	pid_t,	pid) | ||||||
| 		__array(	char,	comm, TASK_COMM_LEN) | 		__array(	char,	comm, TASK_COMM_LEN) | ||||||
| 		__field( unsigned long, clone_flags) | 		__field( unsigned long, clone_flags) | ||||||
| 		__field(	int,    oom_score_adj) | 		__field(	short,	oom_score_adj) | ||||||
| 	), | 	), | ||||||
| 
 | 
 | ||||||
| 	TP_fast_assign( | 	TP_fast_assign( | ||||||
|  | @ -25,7 +25,7 @@ TRACE_EVENT(task_newtask, | ||||||
| 		__entry->oom_score_adj = task->signal->oom_score_adj; | 		__entry->oom_score_adj = task->signal->oom_score_adj; | ||||||
| 	), | 	), | ||||||
| 
 | 
 | ||||||
| 	TP_printk("pid=%d comm=%s clone_flags=%lx oom_score_adj=%d", | 	TP_printk("pid=%d comm=%s clone_flags=%lx oom_score_adj=%hd", | ||||||
| 		__entry->pid, __entry->comm, | 		__entry->pid, __entry->comm, | ||||||
| 		__entry->clone_flags, __entry->oom_score_adj) | 		__entry->clone_flags, __entry->oom_score_adj) | ||||||
| ); | ); | ||||||
|  | @ -40,7 +40,7 @@ TRACE_EVENT(task_rename, | ||||||
| 		__field(	pid_t,	pid) | 		__field(	pid_t,	pid) | ||||||
| 		__array(	char, oldcomm,  TASK_COMM_LEN) | 		__array(	char, oldcomm,  TASK_COMM_LEN) | ||||||
| 		__array(	char, newcomm,  TASK_COMM_LEN) | 		__array(	char, newcomm,  TASK_COMM_LEN) | ||||||
| 		__field(	int, oom_score_adj) | 		__field(	short,	oom_score_adj) | ||||||
| 	), | 	), | ||||||
| 
 | 
 | ||||||
| 	TP_fast_assign( | 	TP_fast_assign( | ||||||
|  | @ -50,7 +50,7 @@ TRACE_EVENT(task_rename, | ||||||
| 		__entry->oom_score_adj = task->signal->oom_score_adj; | 		__entry->oom_score_adj = task->signal->oom_score_adj; | ||||||
| 	), | 	), | ||||||
| 
 | 
 | ||||||
| 	TP_printk("pid=%d oldcomm=%s newcomm=%s oom_score_adj=%d", | 	TP_printk("pid=%d oldcomm=%s newcomm=%s oom_score_adj=%hd", | ||||||
| 		__entry->pid, __entry->oldcomm, | 		__entry->pid, __entry->oldcomm, | ||||||
| 		__entry->newcomm, __entry->oom_score_adj) | 		__entry->newcomm, __entry->oom_score_adj) | ||||||
| ); | ); | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								mm/ksm.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								mm/ksm.c
									
										
									
									
									
								
							|  | @ -1919,7 +1919,7 @@ static ssize_t run_store(struct kobject *kobj, struct kobj_attribute *attr, | ||||||
| 	if (ksm_run != flags) { | 	if (ksm_run != flags) { | ||||||
| 		ksm_run = flags; | 		ksm_run = flags; | ||||||
| 		if (flags & KSM_RUN_UNMERGE) { | 		if (flags & KSM_RUN_UNMERGE) { | ||||||
| 			int oom_score_adj; | 			short oom_score_adj; | ||||||
| 
 | 
 | ||||||
| 			oom_score_adj = test_set_oom_score_adj(OOM_SCORE_ADJ_MAX); | 			oom_score_adj = test_set_oom_score_adj(OOM_SCORE_ADJ_MAX); | ||||||
| 			err = unmerge_and_remove_all_rmap_items(); | 			err = unmerge_and_remove_all_rmap_items(); | ||||||
|  |  | ||||||
|  | @ -53,7 +53,7 @@ static DEFINE_SPINLOCK(zone_scan_lock); | ||||||
|  * @old_val.  Usually used to reinstate a previous value to prevent racing with |  * @old_val.  Usually used to reinstate a previous value to prevent racing with | ||||||
|  * userspacing tuning the value in the interim. |  * userspacing tuning the value in the interim. | ||||||
|  */ |  */ | ||||||
| void compare_swap_oom_score_adj(int old_val, int new_val) | void compare_swap_oom_score_adj(short old_val, short new_val) | ||||||
| { | { | ||||||
| 	struct sighand_struct *sighand = current->sighand; | 	struct sighand_struct *sighand = current->sighand; | ||||||
| 
 | 
 | ||||||
|  | @ -72,7 +72,7 @@ void compare_swap_oom_score_adj(int old_val, int new_val) | ||||||
|  * synchronization and returns the old value.  Usually used to temporarily |  * synchronization and returns the old value.  Usually used to temporarily | ||||||
|  * set a value, save the old value in the caller, and then reinstate it later. |  * set a value, save the old value in the caller, and then reinstate it later. | ||||||
|  */ |  */ | ||||||
| int test_set_oom_score_adj(int new_val) | short test_set_oom_score_adj(short new_val) | ||||||
| { | { | ||||||
| 	struct sighand_struct *sighand = current->sighand; | 	struct sighand_struct *sighand = current->sighand; | ||||||
| 	int old_val; | 	int old_val; | ||||||
|  | @ -193,7 +193,7 @@ unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg, | ||||||
| 	if (!p) | 	if (!p) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	adj = p->signal->oom_score_adj; | 	adj = (long)p->signal->oom_score_adj; | ||||||
| 	if (adj == OOM_SCORE_ADJ_MIN) { | 	if (adj == OOM_SCORE_ADJ_MIN) { | ||||||
| 		task_unlock(p); | 		task_unlock(p); | ||||||
| 		return 0; | 		return 0; | ||||||
|  | @ -399,7 +399,7 @@ static void dump_tasks(const struct mem_cgroup *memcg, const nodemask_t *nodemas | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		pr_info("[%5d] %5d %5d %8lu %8lu %7lu %8lu         %5d %s\n", | 		pr_info("[%5d] %5d %5d %8lu %8lu %7lu %8lu         %5hd %s\n", | ||||||
| 			task->pid, from_kuid(&init_user_ns, task_uid(task)), | 			task->pid, from_kuid(&init_user_ns, task_uid(task)), | ||||||
| 			task->tgid, task->mm->total_vm, get_mm_rss(task->mm), | 			task->tgid, task->mm->total_vm, get_mm_rss(task->mm), | ||||||
| 			task->mm->nr_ptes, | 			task->mm->nr_ptes, | ||||||
|  | @ -415,7 +415,7 @@ 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_score_adj=%d\n", | 		"oom_score_adj=%hd\n", | ||||||
| 		current->comm, gfp_mask, order, | 		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); | ||||||
|  |  | ||||||
|  | @ -1498,7 +1498,7 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) | ||||||
| 	struct address_space *mapping; | 	struct address_space *mapping; | ||||||
| 	struct inode *inode; | 	struct inode *inode; | ||||||
| 	struct filename *pathname; | 	struct filename *pathname; | ||||||
| 	int oom_score_adj; | 	short oom_score_adj; | ||||||
| 	int i, type, prev; | 	int i, type, prev; | ||||||
| 	int err; | 	int err; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 David Rientjes
				David Rientjes