mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-01 00:58:39 +02:00 
			
		
		
		
	cgroup/cpuset: move v1 interfaces to cpuset-v1.c
Move legacy cpuset controller interfaces files and corresponding code into cpuset-v1.c. 'update_flag', 'cpuset_write_resmask' and 'cpuset_common_seq_show' are also used for v1, so declare them in cpuset-internal.h. 'cpuset_write_s64', 'cpuset_read_s64' and 'fmeter_getrate' are only used cpuset-v1.c now, make it static. Signed-off-by: Chen Ridong <chenridong@huawei.com> Acked-by: Waiman Long <longman@redhat.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
		
							parent
							
								
									be126b5b1b
								
							
						
					
					
						commit
						b0ced9d378
					
				
					 3 changed files with 199 additions and 199 deletions
				
			
		|  | @ -271,15 +271,16 @@ void callback_lock_irq(void); | |||
| void callback_unlock_irq(void); | ||||
| void update_tasks_cpumask(struct cpuset *cs, struct cpumask *new_cpus); | ||||
| void update_tasks_nodemask(struct cpuset *cs); | ||||
| int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, int turning_on); | ||||
| ssize_t cpuset_write_resmask(struct kernfs_open_file *of, | ||||
| 				    char *buf, size_t nbytes, loff_t off); | ||||
| int cpuset_common_seq_show(struct seq_file *sf, void *v); | ||||
| 
 | ||||
| /*
 | ||||
|  * cpuset-v1.c | ||||
|  */ | ||||
| extern struct cftype legacy_files[]; | ||||
| void fmeter_init(struct fmeter *fmp); | ||||
| int fmeter_getrate(struct fmeter *fmp); | ||||
| int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft, | ||||
| 			    s64 val); | ||||
| s64 cpuset_read_s64(struct cgroup_subsys_state *css, struct cftype *cft); | ||||
| void cpuset_update_task_spread_flags(struct cpuset *cs, | ||||
| 					struct task_struct *tsk); | ||||
| void update_tasks_flags(struct cpuset *cs); | ||||
|  |  | |||
|  | @ -100,7 +100,7 @@ static void fmeter_markevent(struct fmeter *fmp) | |||
| } | ||||
| 
 | ||||
| /* Process any previous ticks, then return current value. */ | ||||
| int fmeter_getrate(struct fmeter *fmp) | ||||
| static int fmeter_getrate(struct fmeter *fmp) | ||||
| { | ||||
| 	int val; | ||||
| 
 | ||||
|  | @ -161,7 +161,7 @@ static int update_relax_domain_level(struct cpuset *cs, s64 val) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft, | ||||
| static int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft, | ||||
| 			    s64 val) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(css); | ||||
|  | @ -187,7 +187,7 @@ int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft, | |||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
| s64 cpuset_read_s64(struct cgroup_subsys_state *css, struct cftype *cft) | ||||
| static s64 cpuset_read_s64(struct cgroup_subsys_state *css, struct cftype *cft) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(css); | ||||
| 	cpuset_filetype_t type = cft->private; | ||||
|  | @ -372,3 +372,191 @@ int validate_change_legacy(struct cpuset *cur, struct cpuset *trial) | |||
| out: | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static u64 cpuset_read_u64(struct cgroup_subsys_state *css, struct cftype *cft) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(css); | ||||
| 	cpuset_filetype_t type = cft->private; | ||||
| 
 | ||||
| 	switch (type) { | ||||
| 	case FILE_CPU_EXCLUSIVE: | ||||
| 		return is_cpu_exclusive(cs); | ||||
| 	case FILE_MEM_EXCLUSIVE: | ||||
| 		return is_mem_exclusive(cs); | ||||
| 	case FILE_MEM_HARDWALL: | ||||
| 		return is_mem_hardwall(cs); | ||||
| 	case FILE_SCHED_LOAD_BALANCE: | ||||
| 		return is_sched_load_balance(cs); | ||||
| 	case FILE_MEMORY_MIGRATE: | ||||
| 		return is_memory_migrate(cs); | ||||
| 	case FILE_MEMORY_PRESSURE_ENABLED: | ||||
| 		return cpuset_memory_pressure_enabled; | ||||
| 	case FILE_MEMORY_PRESSURE: | ||||
| 		return fmeter_getrate(&cs->fmeter); | ||||
| 	case FILE_SPREAD_PAGE: | ||||
| 		return is_spread_page(cs); | ||||
| 	case FILE_SPREAD_SLAB: | ||||
| 		return is_spread_slab(cs); | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Unreachable but makes gcc happy */ | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft, | ||||
| 			    u64 val) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(css); | ||||
| 	cpuset_filetype_t type = cft->private; | ||||
| 	int retval = 0; | ||||
| 
 | ||||
| 	cpus_read_lock(); | ||||
| 	cpuset_lock(); | ||||
| 	if (!is_cpuset_online(cs)) { | ||||
| 		retval = -ENODEV; | ||||
| 		goto out_unlock; | ||||
| 	} | ||||
| 
 | ||||
| 	switch (type) { | ||||
| 	case FILE_CPU_EXCLUSIVE: | ||||
| 		retval = update_flag(CS_CPU_EXCLUSIVE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_MEM_EXCLUSIVE: | ||||
| 		retval = update_flag(CS_MEM_EXCLUSIVE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_MEM_HARDWALL: | ||||
| 		retval = update_flag(CS_MEM_HARDWALL, cs, val); | ||||
| 		break; | ||||
| 	case FILE_SCHED_LOAD_BALANCE: | ||||
| 		retval = update_flag(CS_SCHED_LOAD_BALANCE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_MEMORY_MIGRATE: | ||||
| 		retval = update_flag(CS_MEMORY_MIGRATE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_MEMORY_PRESSURE_ENABLED: | ||||
| 		cpuset_memory_pressure_enabled = !!val; | ||||
| 		break; | ||||
| 	case FILE_SPREAD_PAGE: | ||||
| 		retval = update_flag(CS_SPREAD_PAGE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_SPREAD_SLAB: | ||||
| 		retval = update_flag(CS_SPREAD_SLAB, cs, val); | ||||
| 		break; | ||||
| 	default: | ||||
| 		retval = -EINVAL; | ||||
| 		break; | ||||
| 	} | ||||
| out_unlock: | ||||
| 	cpuset_unlock(); | ||||
| 	cpus_read_unlock(); | ||||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * for the common functions, 'private' gives the type of file | ||||
|  */ | ||||
| 
 | ||||
| struct cftype legacy_files[] = { | ||||
| 	{ | ||||
| 		.name = "cpus", | ||||
| 		.seq_show = cpuset_common_seq_show, | ||||
| 		.write = cpuset_write_resmask, | ||||
| 		.max_write_len = (100U + 6 * NR_CPUS), | ||||
| 		.private = FILE_CPULIST, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "mems", | ||||
| 		.seq_show = cpuset_common_seq_show, | ||||
| 		.write = cpuset_write_resmask, | ||||
| 		.max_write_len = (100U + 6 * MAX_NUMNODES), | ||||
| 		.private = FILE_MEMLIST, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "effective_cpus", | ||||
| 		.seq_show = cpuset_common_seq_show, | ||||
| 		.private = FILE_EFFECTIVE_CPULIST, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "effective_mems", | ||||
| 		.seq_show = cpuset_common_seq_show, | ||||
| 		.private = FILE_EFFECTIVE_MEMLIST, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "cpu_exclusive", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_CPU_EXCLUSIVE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "mem_exclusive", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_MEM_EXCLUSIVE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "mem_hardwall", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_MEM_HARDWALL, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "sched_load_balance", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_SCHED_LOAD_BALANCE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "sched_relax_domain_level", | ||||
| 		.read_s64 = cpuset_read_s64, | ||||
| 		.write_s64 = cpuset_write_s64, | ||||
| 		.private = FILE_SCHED_RELAX_DOMAIN_LEVEL, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "memory_migrate", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_MEMORY_MIGRATE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "memory_pressure", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.private = FILE_MEMORY_PRESSURE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "memory_spread_page", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_SPREAD_PAGE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		/* obsolete, may be removed in the future */ | ||||
| 		.name = "memory_spread_slab", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_SPREAD_SLAB, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "memory_pressure_enabled", | ||||
| 		.flags = CFTYPE_ONLY_ON_ROOT, | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_MEMORY_PRESSURE_ENABLED, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ }	/* terminate */ | ||||
| }; | ||||
|  |  | |||
|  | @ -1113,8 +1113,6 @@ enum partition_cmd { | |||
| 	partcmd_invalidate,	/* Make partition invalid	  */ | ||||
| }; | ||||
| 
 | ||||
| static int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, | ||||
| 		       int turning_on); | ||||
| static void update_sibling_cpumasks(struct cpuset *parent, struct cpuset *cs, | ||||
| 				    struct tmpmasks *tmp); | ||||
| 
 | ||||
|  | @ -2709,7 +2707,7 @@ bool current_cpuset_is_being_rebound(void) | |||
|  * Call with cpuset_mutex held. | ||||
|  */ | ||||
| 
 | ||||
| static int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, | ||||
| int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, | ||||
| 		       int turning_on) | ||||
| { | ||||
| 	struct cpuset *trialcs; | ||||
|  | @ -3094,59 +3092,10 @@ static void cpuset_attach(struct cgroup_taskset *tset) | |||
| 	mutex_unlock(&cpuset_mutex); | ||||
| } | ||||
| 
 | ||||
| static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft, | ||||
| 			    u64 val) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(css); | ||||
| 	cpuset_filetype_t type = cft->private; | ||||
| 	int retval = 0; | ||||
| 
 | ||||
| 	cpus_read_lock(); | ||||
| 	mutex_lock(&cpuset_mutex); | ||||
| 	if (!is_cpuset_online(cs)) { | ||||
| 		retval = -ENODEV; | ||||
| 		goto out_unlock; | ||||
| 	} | ||||
| 
 | ||||
| 	switch (type) { | ||||
| 	case FILE_CPU_EXCLUSIVE: | ||||
| 		retval = update_flag(CS_CPU_EXCLUSIVE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_MEM_EXCLUSIVE: | ||||
| 		retval = update_flag(CS_MEM_EXCLUSIVE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_MEM_HARDWALL: | ||||
| 		retval = update_flag(CS_MEM_HARDWALL, cs, val); | ||||
| 		break; | ||||
| 	case FILE_SCHED_LOAD_BALANCE: | ||||
| 		retval = update_flag(CS_SCHED_LOAD_BALANCE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_MEMORY_MIGRATE: | ||||
| 		retval = update_flag(CS_MEMORY_MIGRATE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_MEMORY_PRESSURE_ENABLED: | ||||
| 		cpuset_memory_pressure_enabled = !!val; | ||||
| 		break; | ||||
| 	case FILE_SPREAD_PAGE: | ||||
| 		retval = update_flag(CS_SPREAD_PAGE, cs, val); | ||||
| 		break; | ||||
| 	case FILE_SPREAD_SLAB: | ||||
| 		retval = update_flag(CS_SPREAD_SLAB, cs, val); | ||||
| 		break; | ||||
| 	default: | ||||
| 		retval = -EINVAL; | ||||
| 		break; | ||||
| 	} | ||||
| out_unlock: | ||||
| 	mutex_unlock(&cpuset_mutex); | ||||
| 	cpus_read_unlock(); | ||||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Common handling for a write to a "cpus" or "mems" file. | ||||
|  */ | ||||
| static ssize_t cpuset_write_resmask(struct kernfs_open_file *of, | ||||
| ssize_t cpuset_write_resmask(struct kernfs_open_file *of, | ||||
| 				    char *buf, size_t nbytes, loff_t off) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(of_css(of)); | ||||
|  | @ -3221,7 +3170,7 @@ static ssize_t cpuset_write_resmask(struct kernfs_open_file *of, | |||
|  * and since these maps can change value dynamically, one could read | ||||
|  * gibberish by doing partial reads while a list was changing. | ||||
|  */ | ||||
| static int cpuset_common_seq_show(struct seq_file *sf, void *v) | ||||
| int cpuset_common_seq_show(struct seq_file *sf, void *v) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(seq_css(sf)); | ||||
| 	cpuset_filetype_t type = seq_cft(sf)->private; | ||||
|  | @ -3262,37 +3211,6 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static u64 cpuset_read_u64(struct cgroup_subsys_state *css, struct cftype *cft) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(css); | ||||
| 	cpuset_filetype_t type = cft->private; | ||||
| 	switch (type) { | ||||
| 	case FILE_CPU_EXCLUSIVE: | ||||
| 		return is_cpu_exclusive(cs); | ||||
| 	case FILE_MEM_EXCLUSIVE: | ||||
| 		return is_mem_exclusive(cs); | ||||
| 	case FILE_MEM_HARDWALL: | ||||
| 		return is_mem_hardwall(cs); | ||||
| 	case FILE_SCHED_LOAD_BALANCE: | ||||
| 		return is_sched_load_balance(cs); | ||||
| 	case FILE_MEMORY_MIGRATE: | ||||
| 		return is_memory_migrate(cs); | ||||
| 	case FILE_MEMORY_PRESSURE_ENABLED: | ||||
| 		return cpuset_memory_pressure_enabled; | ||||
| 	case FILE_MEMORY_PRESSURE: | ||||
| 		return fmeter_getrate(&cs->fmeter); | ||||
| 	case FILE_SPREAD_PAGE: | ||||
| 		return is_spread_page(cs); | ||||
| 	case FILE_SPREAD_SLAB: | ||||
| 		return is_spread_slab(cs); | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Unreachable but makes gcc happy */ | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int sched_partition_show(struct seq_file *seq, void *v) | ||||
| { | ||||
| 	struct cpuset *cs = css_cs(seq_css(seq)); | ||||
|  | @ -3356,113 +3274,6 @@ static ssize_t sched_partition_write(struct kernfs_open_file *of, char *buf, | |||
| 	return retval ?: nbytes; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * for the common functions, 'private' gives the type of file | ||||
|  */ | ||||
| 
 | ||||
| static struct cftype legacy_files[] = { | ||||
| 	{ | ||||
| 		.name = "cpus", | ||||
| 		.seq_show = cpuset_common_seq_show, | ||||
| 		.write = cpuset_write_resmask, | ||||
| 		.max_write_len = (100U + 6 * NR_CPUS), | ||||
| 		.private = FILE_CPULIST, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "mems", | ||||
| 		.seq_show = cpuset_common_seq_show, | ||||
| 		.write = cpuset_write_resmask, | ||||
| 		.max_write_len = (100U + 6 * MAX_NUMNODES), | ||||
| 		.private = FILE_MEMLIST, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "effective_cpus", | ||||
| 		.seq_show = cpuset_common_seq_show, | ||||
| 		.private = FILE_EFFECTIVE_CPULIST, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "effective_mems", | ||||
| 		.seq_show = cpuset_common_seq_show, | ||||
| 		.private = FILE_EFFECTIVE_MEMLIST, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "cpu_exclusive", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_CPU_EXCLUSIVE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "mem_exclusive", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_MEM_EXCLUSIVE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "mem_hardwall", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_MEM_HARDWALL, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "sched_load_balance", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_SCHED_LOAD_BALANCE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "sched_relax_domain_level", | ||||
| 		.read_s64 = cpuset_read_s64, | ||||
| 		.write_s64 = cpuset_write_s64, | ||||
| 		.private = FILE_SCHED_RELAX_DOMAIN_LEVEL, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "memory_migrate", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_MEMORY_MIGRATE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "memory_pressure", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.private = FILE_MEMORY_PRESSURE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "memory_spread_page", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_SPREAD_PAGE, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		/* obsolete, may be removed in the future */ | ||||
| 		.name = "memory_spread_slab", | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_SPREAD_SLAB, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ | ||||
| 		.name = "memory_pressure_enabled", | ||||
| 		.flags = CFTYPE_ONLY_ON_ROOT, | ||||
| 		.read_u64 = cpuset_read_u64, | ||||
| 		.write_u64 = cpuset_write_u64, | ||||
| 		.private = FILE_MEMORY_PRESSURE_ENABLED, | ||||
| 	}, | ||||
| 
 | ||||
| 	{ }	/* terminate */ | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * This is currently a minimal set for the default hierarchy. It can be | ||||
|  * expanded later on by migrating more features and control files from v1. | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Chen Ridong
						Chen Ridong