xref: /linux/kernel/cgroup/cpuset-v1.c (revision 40d8c81577db09b71ee5402ba336b642d32d6a82)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #include "cgroup-internal.h"
4 #include "cpuset-internal.h"
5 
6 /*
7  * Legacy hierarchy call to cgroup_transfer_tasks() is handled asynchrously
8  */
9 struct cpuset_remove_tasks_struct {
10 	struct work_struct work;
11 	struct cpuset *cs;
12 };
13 
14 /*
15  * Frequency meter - How fast is some event occurring?
16  *
17  * These routines manage a digitally filtered, constant time based,
18  * event frequency meter.  There are four routines:
19  *   fmeter_init() - initialize a frequency meter.
20  *   fmeter_markevent() - called each time the event happens.
21  *   fmeter_getrate() - returns the recent rate of such events.
22  *   fmeter_update() - internal routine used to update fmeter.
23  *
24  * A common data structure is passed to each of these routines,
25  * which is used to keep track of the state required to manage the
26  * frequency meter and its digital filter.
27  *
28  * The filter works on the number of events marked per unit time.
29  * The filter is single-pole low-pass recursive (IIR).  The time unit
30  * is 1 second.  Arithmetic is done using 32-bit integers scaled to
31  * simulate 3 decimal digits of precision (multiplied by 1000).
32  *
33  * With an FM_COEF of 933, and a time base of 1 second, the filter
34  * has a half-life of 10 seconds, meaning that if the events quit
35  * happening, then the rate returned from the fmeter_getrate()
36  * will be cut in half each 10 seconds, until it converges to zero.
37  *
38  * It is not worth doing a real infinitely recursive filter.  If more
39  * than FM_MAXTICKS ticks have elapsed since the last filter event,
40  * just compute FM_MAXTICKS ticks worth, by which point the level
41  * will be stable.
42  *
43  * Limit the count of unprocessed events to FM_MAXCNT, so as to avoid
44  * arithmetic overflow in the fmeter_update() routine.
45  *
46  * Given the simple 32 bit integer arithmetic used, this meter works
47  * best for reporting rates between one per millisecond (msec) and
48  * one per 32 (approx) seconds.  At constant rates faster than one
49  * per msec it maxes out at values just under 1,000,000.  At constant
50  * rates between one per msec, and one per second it will stabilize
51  * to a value N*1000, where N is the rate of events per second.
52  * At constant rates between one per second and one per 32 seconds,
53  * it will be choppy, moving up on the seconds that have an event,
54  * and then decaying until the next event.  At rates slower than
55  * about one in 32 seconds, it decays all the way back to zero between
56  * each event.
57  */
58 
59 #define FM_COEF 933		/* coefficient for half-life of 10 secs */
60 #define FM_MAXTICKS ((u32)99)   /* useless computing more ticks than this */
61 #define FM_MAXCNT 1000000	/* limit cnt to avoid overflow */
62 #define FM_SCALE 1000		/* faux fixed point scale */
63 
64 /* Initialize a frequency meter */
fmeter_init(struct fmeter * fmp)65 static void fmeter_init(struct fmeter *fmp)
66 {
67 	fmp->cnt = 0;
68 	fmp->val = 0;
69 	fmp->time = 0;
70 	spin_lock_init(&fmp->lock);
71 }
72 
73 /* Internal meter update - process cnt events and update value */
fmeter_update(struct fmeter * fmp)74 static void fmeter_update(struct fmeter *fmp)
75 {
76 	time64_t now;
77 	u32 ticks;
78 
79 	now = ktime_get_seconds();
80 	ticks = now - fmp->time;
81 
82 	if (ticks == 0)
83 		return;
84 
85 	ticks = min(FM_MAXTICKS, ticks);
86 	while (ticks-- > 0)
87 		fmp->val = (FM_COEF * fmp->val) / FM_SCALE;
88 	fmp->time = now;
89 
90 	fmp->val += ((FM_SCALE - FM_COEF) * fmp->cnt) / FM_SCALE;
91 	fmp->cnt = 0;
92 }
93 
94 /* Process any previous ticks, then bump cnt by one (times scale). */
fmeter_markevent(struct fmeter * fmp)95 static void fmeter_markevent(struct fmeter *fmp)
96 {
97 	spin_lock(&fmp->lock);
98 	fmeter_update(fmp);
99 	fmp->cnt = min(FM_MAXCNT, fmp->cnt + FM_SCALE);
100 	spin_unlock(&fmp->lock);
101 }
102 
103 /* Process any previous ticks, then return current value. */
fmeter_getrate(struct fmeter * fmp)104 static int fmeter_getrate(struct fmeter *fmp)
105 {
106 	int val;
107 
108 	spin_lock(&fmp->lock);
109 	fmeter_update(fmp);
110 	val = fmp->val;
111 	spin_unlock(&fmp->lock);
112 	return val;
113 }
114 
115 /*
116  * Collection of memory_pressure is suppressed unless
117  * this flag is enabled by writing "1" to the special
118  * cpuset file 'memory_pressure_enabled' in the root cpuset.
119  */
120 
121 int cpuset_memory_pressure_enabled __read_mostly;
122 
123 /*
124  * __cpuset_memory_pressure_bump - keep stats of per-cpuset reclaims.
125  *
126  * Keep a running average of the rate of synchronous (direct)
127  * page reclaim efforts initiated by tasks in each cpuset.
128  *
129  * This represents the rate at which some task in the cpuset
130  * ran low on memory on all nodes it was allowed to use, and
131  * had to enter the kernels page reclaim code in an effort to
132  * create more free memory by tossing clean pages or swapping
133  * or writing dirty pages.
134  *
135  * Display to user space in the per-cpuset read-only file
136  * "memory_pressure".  Value displayed is an integer
137  * representing the recent rate of entry into the synchronous
138  * (direct) page reclaim by any task attached to the cpuset.
139  */
140 
__cpuset_memory_pressure_bump(void)141 void __cpuset_memory_pressure_bump(void)
142 {
143 	rcu_read_lock();
144 	fmeter_markevent(&task_cs(current)->fmeter);
145 	rcu_read_unlock();
146 }
147 
update_relax_domain_level(struct cpuset * cs,s64 val)148 static int update_relax_domain_level(struct cpuset *cs, s64 val)
149 {
150 #ifdef CONFIG_SMP
151 	if (val < -1 || val > sched_domain_level_max + 1)
152 		return -EINVAL;
153 #endif
154 
155 	if (val != cs->relax_domain_level) {
156 		cs->relax_domain_level = val;
157 		if (!cpumask_empty(cs->cpus_allowed) &&
158 		    is_sched_load_balance(cs))
159 			rebuild_sched_domains_locked();
160 	}
161 
162 	return 0;
163 }
164 
cpuset_write_s64(struct cgroup_subsys_state * css,struct cftype * cft,s64 val)165 static int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft,
166 			    s64 val)
167 {
168 	struct cpuset *cs = css_cs(css);
169 	cpuset_filetype_t type = cft->private;
170 	int retval = -ENODEV;
171 
172 	cpuset_full_lock();
173 	if (!is_cpuset_online(cs))
174 		goto out_unlock;
175 
176 	switch (type) {
177 	case FILE_SCHED_RELAX_DOMAIN_LEVEL:
178 		pr_info_once("cpuset.%s is deprecated\n", cft->name);
179 		retval = update_relax_domain_level(cs, val);
180 		break;
181 	default:
182 		retval = -EINVAL;
183 		break;
184 	}
185 out_unlock:
186 	cpuset_full_unlock();
187 	return retval;
188 }
189 
cpuset_read_s64(struct cgroup_subsys_state * css,struct cftype * cft)190 static s64 cpuset_read_s64(struct cgroup_subsys_state *css, struct cftype *cft)
191 {
192 	struct cpuset *cs = css_cs(css);
193 	cpuset_filetype_t type = cft->private;
194 
195 	switch (type) {
196 	case FILE_SCHED_RELAX_DOMAIN_LEVEL:
197 		return cs->relax_domain_level;
198 	default:
199 		BUG();
200 	}
201 
202 	/* Unreachable but makes gcc happy */
203 	return 0;
204 }
205 
206 /*
207  * Update a task's spread flag if the cpuset's page spread flag is set.
208  *
209  * Call with callback_lock or cpuset_mutex held. The check can be skipped
210  * if on default hierarchy.
211  */
cpuset1_update_task_spread_flags(struct cpuset * cs,struct task_struct * tsk)212 void cpuset1_update_task_spread_flags(struct cpuset *cs,
213 					struct task_struct *tsk)
214 {
215 	if (cgroup_subsys_on_dfl(cpuset_cgrp_subsys))
216 		return;
217 
218 	if (is_spread_page(cs))
219 		task_set_spread_page(tsk);
220 	else
221 		task_clear_spread_page(tsk);
222 }
223 
224 /**
225  * cpuset1_update_tasks_flags - update the page spread flag of cpuset tasks
226  * @cs: the cpuset whose tasks need their page spread flag updated
227  *
228  * Iterate through each task of @cs updating its page spread flag.  As this
229  * function is called with cpuset_mutex held, cpuset membership stays
230  * stable.
231  */
cpuset1_update_tasks_flags(struct cpuset * cs)232 void cpuset1_update_tasks_flags(struct cpuset *cs)
233 {
234 	struct css_task_iter it;
235 	struct task_struct *task;
236 
237 	css_task_iter_start(&cs->css, 0, &it);
238 	while ((task = css_task_iter_next(&it)))
239 		cpuset1_update_task_spread_flags(cs, task);
240 	css_task_iter_end(&it);
241 }
242 
243 /*
244  * If CPU and/or memory hotplug handlers, below, unplug any CPUs
245  * or memory nodes, we need to walk over the cpuset hierarchy,
246  * removing that CPU or node from all cpusets.  If this removes the
247  * last CPU or node from a cpuset, then move the tasks in the empty
248  * cpuset to its next-highest non-empty parent.
249  */
remove_tasks_in_empty_cpuset(struct cpuset * cs)250 static void remove_tasks_in_empty_cpuset(struct cpuset *cs)
251 {
252 	struct cpuset *parent;
253 
254 	/*
255 	 * Find its next-highest non-empty parent, (top cpuset
256 	 * has online cpus, so can't be empty).
257 	 */
258 	parent = parent_cs(cs);
259 	while (cpumask_empty(parent->cpus_allowed) ||
260 			nodes_empty(parent->mems_allowed))
261 		parent = parent_cs(parent);
262 
263 	if (cgroup_transfer_tasks(parent->css.cgroup, cs->css.cgroup)) {
264 		pr_err("cpuset: failed to transfer tasks out of empty cpuset ");
265 		pr_cont_cgroup_name(cs->css.cgroup);
266 		pr_cont("\n");
267 	}
268 }
269 
cpuset_migrate_tasks_workfn(struct work_struct * work)270 static void cpuset_migrate_tasks_workfn(struct work_struct *work)
271 {
272 	struct cpuset_remove_tasks_struct *s;
273 
274 	s = container_of(work, struct cpuset_remove_tasks_struct, work);
275 	remove_tasks_in_empty_cpuset(s->cs);
276 	css_put(&s->cs->css);
277 	kfree(s);
278 }
279 
cpuset1_hotplug_update_tasks(struct cpuset * cs,struct cpumask * new_cpus,nodemask_t * new_mems,bool cpus_updated,bool mems_updated)280 void cpuset1_hotplug_update_tasks(struct cpuset *cs,
281 			    struct cpumask *new_cpus, nodemask_t *new_mems,
282 			    bool cpus_updated, bool mems_updated)
283 {
284 	bool is_empty;
285 
286 	cpuset_callback_lock_irq();
287 	cpumask_copy(cs->cpus_allowed, new_cpus);
288 	cpumask_copy(cs->effective_cpus, new_cpus);
289 	cs->mems_allowed = *new_mems;
290 	cs->effective_mems = *new_mems;
291 	cpuset_callback_unlock_irq();
292 
293 	/*
294 	 * Don't call cpuset_update_tasks_cpumask() if the cpuset becomes empty,
295 	 * as the tasks will be migrated to an ancestor.
296 	 */
297 	if (cpus_updated && !cpumask_empty(cs->cpus_allowed))
298 		cpuset_update_tasks_cpumask(cs, new_cpus);
299 	if (mems_updated && !nodes_empty(cs->mems_allowed))
300 		cpuset_update_tasks_nodemask(cs);
301 
302 	is_empty = cpumask_empty(cs->cpus_allowed) ||
303 		   nodes_empty(cs->mems_allowed);
304 
305 	/*
306 	 * Move tasks to the nearest ancestor with execution resources,
307 	 * This is full cgroup operation which will also call back into
308 	 * cpuset. Execute it asynchronously using workqueue.
309 	 */
310 	if (is_empty && cgroup_has_tasks(cs->css.cgroup) &&
311 	    css_tryget_online(&cs->css)) {
312 		struct cpuset_remove_tasks_struct *s;
313 
314 		s = kzalloc_obj(*s);
315 		if (WARN_ON_ONCE(!s)) {
316 			css_put(&cs->css);
317 			return;
318 		}
319 
320 		s->cs = cs;
321 		INIT_WORK(&s->work, cpuset_migrate_tasks_workfn);
322 		schedule_work(&s->work);
323 	}
324 }
325 
326 /*
327  * is_cpuset_subset(p, q) - Is cpuset p a subset of cpuset q?
328  *
329  * One cpuset is a subset of another if all its allowed CPUs and
330  * Memory Nodes are a subset of the other, and its exclusive flags
331  * are only set if the other's are set.  Call holding cpuset_mutex.
332  */
333 
is_cpuset_subset(const struct cpuset * p,const struct cpuset * q)334 static int is_cpuset_subset(const struct cpuset *p, const struct cpuset *q)
335 {
336 	return	cpumask_subset(p->cpus_allowed, q->cpus_allowed) &&
337 		nodes_subset(p->mems_allowed, q->mems_allowed) &&
338 		is_cpu_exclusive(p) <= is_cpu_exclusive(q) &&
339 		is_mem_exclusive(p) <= is_mem_exclusive(q);
340 }
341 
342 /*
343  * cpuset1_validate_change() - Validate conditions specific to legacy (v1)
344  *                            behavior.
345  */
cpuset1_validate_change(struct cpuset * cur,struct cpuset * trial)346 int cpuset1_validate_change(struct cpuset *cur, struct cpuset *trial)
347 {
348 	struct cgroup_subsys_state *css;
349 	struct cpuset *c, *par;
350 	int ret;
351 
352 	WARN_ON_ONCE(!rcu_read_lock_held());
353 
354 	/* Each of our child cpusets must be a subset of us */
355 	ret = -EBUSY;
356 	cpuset_for_each_child(c, css, cur)
357 		if (!is_cpuset_subset(c, trial))
358 			goto out;
359 
360 	/* On legacy hierarchy, we must be a subset of our parent cpuset. */
361 	ret = -EACCES;
362 	par = parent_cs(cur);
363 	if (par && !is_cpuset_subset(trial, par))
364 		goto out;
365 
366 	/*
367 	 * Cpusets with tasks - existing or newly being attached - can't
368 	 * be changed to have empty cpus_allowed or mems_allowed.
369 	 */
370 	ret = -ENOSPC;
371 	if (cpuset_is_populated(cur)) {
372 		if (!cpumask_empty(cur->cpus_allowed) &&
373 		    cpumask_empty(trial->cpus_allowed))
374 			goto out;
375 		if (!nodes_empty(cur->mems_allowed) &&
376 		    nodes_empty(trial->mems_allowed))
377 			goto out;
378 	}
379 
380 	ret = 0;
381 out:
382 	return ret;
383 }
384 
385 /*
386  * cpuset1_cpus_excl_conflict() - Check if two cpusets have exclusive CPU conflicts
387  *                                to legacy (v1)
388  * @cs1: first cpuset to check
389  * @cs2: second cpuset to check
390  *
391  * Returns: true if CPU exclusivity conflict exists, false otherwise
392  *
393  * If either cpuset is CPU exclusive, their allowed CPUs cannot intersect.
394  */
cpuset1_cpus_excl_conflict(struct cpuset * cs1,struct cpuset * cs2)395 bool cpuset1_cpus_excl_conflict(struct cpuset *cs1, struct cpuset *cs2)
396 {
397 	if (is_cpu_exclusive(cs1) || is_cpu_exclusive(cs2))
398 		return cpumask_intersects(cs1->cpus_allowed,
399 					  cs2->cpus_allowed);
400 
401 	return false;
402 }
403 
404 #ifdef CONFIG_PROC_PID_CPUSET
405 /*
406  * proc_cpuset_show()
407  *  - Print tasks cpuset path into seq_file.
408  *  - Used for /proc/<pid>/cpuset.
409  */
proc_cpuset_show(struct seq_file * m,struct pid_namespace * ns,struct pid * pid,struct task_struct * tsk)410 int proc_cpuset_show(struct seq_file *m, struct pid_namespace *ns,
411 		     struct pid *pid, struct task_struct *tsk)
412 {
413 	char *buf;
414 	struct cgroup_subsys_state *css;
415 	int retval;
416 
417 	retval = -ENOMEM;
418 	buf = kmalloc(PATH_MAX, GFP_KERNEL);
419 	if (!buf)
420 		goto out;
421 
422 	rcu_read_lock();
423 	spin_lock_irq(&css_set_lock);
424 	css = task_css(tsk, cpuset_cgrp_id);
425 	retval = cgroup_path_ns_locked(css->cgroup, buf, PATH_MAX,
426 				       current->nsproxy->cgroup_ns);
427 	spin_unlock_irq(&css_set_lock);
428 	rcu_read_unlock();
429 
430 	if (retval == -E2BIG)
431 		retval = -ENAMETOOLONG;
432 	if (retval < 0)
433 		goto out_free;
434 	seq_puts(m, buf);
435 	seq_putc(m, '\n');
436 	retval = 0;
437 out_free:
438 	kfree(buf);
439 out:
440 	return retval;
441 }
442 #endif /* CONFIG_PROC_PID_CPUSET */
443 
cpuset_read_u64(struct cgroup_subsys_state * css,struct cftype * cft)444 static u64 cpuset_read_u64(struct cgroup_subsys_state *css, struct cftype *cft)
445 {
446 	struct cpuset *cs = css_cs(css);
447 	cpuset_filetype_t type = cft->private;
448 
449 	switch (type) {
450 	case FILE_CPU_EXCLUSIVE:
451 		return is_cpu_exclusive(cs);
452 	case FILE_MEM_EXCLUSIVE:
453 		return is_mem_exclusive(cs);
454 	case FILE_MEM_HARDWALL:
455 		return is_mem_hardwall(cs);
456 	case FILE_SCHED_LOAD_BALANCE:
457 		return is_sched_load_balance(cs);
458 	case FILE_MEMORY_MIGRATE:
459 		return is_memory_migrate(cs);
460 	case FILE_MEMORY_PRESSURE_ENABLED:
461 		return cpuset_memory_pressure_enabled;
462 	case FILE_MEMORY_PRESSURE:
463 		return fmeter_getrate(&cs->fmeter);
464 	case FILE_SPREAD_PAGE:
465 		return is_spread_page(cs);
466 	case FILE_SPREAD_SLAB:
467 		return is_spread_slab(cs);
468 	default:
469 		BUG();
470 	}
471 
472 	/* Unreachable but makes gcc happy */
473 	return 0;
474 }
475 
cpuset_write_u64(struct cgroup_subsys_state * css,struct cftype * cft,u64 val)476 static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft,
477 			    u64 val)
478 {
479 	struct cpuset *cs = css_cs(css);
480 	cpuset_filetype_t type = cft->private;
481 	int retval = 0;
482 
483 	cpuset_full_lock();
484 	if (!is_cpuset_online(cs)) {
485 		retval = -ENODEV;
486 		goto out_unlock;
487 	}
488 
489 	switch (type) {
490 	case FILE_CPU_EXCLUSIVE:
491 		retval = cpuset_update_flag(CS_CPU_EXCLUSIVE, cs, val);
492 		break;
493 	case FILE_MEM_EXCLUSIVE:
494 		pr_info_once("cpuset.%s is deprecated\n", cft->name);
495 		retval = cpuset_update_flag(CS_MEM_EXCLUSIVE, cs, val);
496 		break;
497 	case FILE_MEM_HARDWALL:
498 		pr_info_once("cpuset.%s is deprecated\n", cft->name);
499 		retval = cpuset_update_flag(CS_MEM_HARDWALL, cs, val);
500 		break;
501 	case FILE_SCHED_LOAD_BALANCE:
502 		pr_info_once("cpuset.%s is deprecated, use cpuset.cpus.partition instead\n", cft->name);
503 		retval = cpuset_update_flag(CS_SCHED_LOAD_BALANCE, cs, val);
504 		break;
505 	case FILE_MEMORY_MIGRATE:
506 		pr_info_once("cpuset.%s is deprecated\n", cft->name);
507 		retval = cpuset_update_flag(CS_MEMORY_MIGRATE, cs, val);
508 		break;
509 	case FILE_MEMORY_PRESSURE_ENABLED:
510 		pr_info_once("cpuset.%s is deprecated, use memory.pressure with CONFIG_PSI instead\n", cft->name);
511 		cpuset_memory_pressure_enabled = !!val;
512 		break;
513 	case FILE_SPREAD_PAGE:
514 		pr_info_once("cpuset.%s is deprecated\n", cft->name);
515 		retval = cpuset_update_flag(CS_SPREAD_PAGE, cs, val);
516 		break;
517 	case FILE_SPREAD_SLAB:
518 		pr_warn_once("cpuset.%s is deprecated\n", cft->name);
519 		retval = cpuset_update_flag(CS_SPREAD_SLAB, cs, val);
520 		break;
521 	default:
522 		retval = -EINVAL;
523 		break;
524 	}
525 out_unlock:
526 	cpuset_full_unlock();
527 	return retval;
528 }
529 
cpuset1_init(struct cpuset * cs)530 void cpuset1_init(struct cpuset *cs)
531 {
532 	fmeter_init(&cs->fmeter);
533 	cs->relax_domain_level = -1;
534 }
535 
cpuset1_online_css(struct cgroup_subsys_state * css)536 void cpuset1_online_css(struct cgroup_subsys_state *css)
537 {
538 	struct cpuset *tmp_cs;
539 	struct cgroup_subsys_state *pos_css;
540 	struct cpuset *cs = css_cs(css);
541 	struct cpuset *parent = parent_cs(cs);
542 
543 	lockdep_assert_cpus_held();
544 	lockdep_assert_cpuset_lock_held();
545 
546 	if (is_spread_page(parent))
547 		set_bit(CS_SPREAD_PAGE, &cs->flags);
548 	if (is_spread_slab(parent))
549 		set_bit(CS_SPREAD_SLAB, &cs->flags);
550 
551 	if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags))
552 		return;
553 
554 	/*
555 	 * Clone @parent's configuration if CGRP_CPUSET_CLONE_CHILDREN is
556 	 * set.  This flag handling is implemented in cgroup core for
557 	 * historical reasons - the flag may be specified during mount.
558 	 *
559 	 * Currently, if any sibling cpusets have exclusive cpus or mem, we
560 	 * refuse to clone the configuration - thereby refusing the task to
561 	 * be entered, and as a result refusing the sys_unshare() or
562 	 * clone() which initiated it.  If this becomes a problem for some
563 	 * users who wish to allow that scenario, then this could be
564 	 * changed to grant parent->cpus_allowed-sibling_cpus_exclusive
565 	 * (and likewise for mems) to the new cgroup.
566 	 */
567 	rcu_read_lock();
568 	cpuset_for_each_child(tmp_cs, pos_css, parent) {
569 		if (is_mem_exclusive(tmp_cs) || is_cpu_exclusive(tmp_cs)) {
570 			rcu_read_unlock();
571 			return;
572 		}
573 	}
574 	rcu_read_unlock();
575 
576 	cpuset_callback_lock_irq();
577 	cs->mems_allowed = parent->mems_allowed;
578 	cs->effective_mems = parent->mems_allowed;
579 	cpumask_copy(cs->cpus_allowed, parent->cpus_allowed);
580 	cpumask_copy(cs->effective_cpus, parent->cpus_allowed);
581 	cpuset_callback_unlock_irq();
582 }
583 
584 static void
update_domain_attr(struct sched_domain_attr * dattr,struct cpuset * c)585 update_domain_attr(struct sched_domain_attr *dattr, struct cpuset *c)
586 {
587 	if (dattr->relax_domain_level < c->relax_domain_level)
588 		dattr->relax_domain_level = c->relax_domain_level;
589 }
590 
update_domain_attr_tree(struct sched_domain_attr * dattr,struct cpuset * root_cs)591 static void update_domain_attr_tree(struct sched_domain_attr *dattr,
592 				    struct cpuset *root_cs)
593 {
594 	struct cpuset *cp;
595 	struct cgroup_subsys_state *pos_css;
596 
597 	rcu_read_lock();
598 	cpuset_for_each_descendant_pre(cp, pos_css, root_cs) {
599 		/* skip the whole subtree if @cp doesn't have any CPU */
600 		if (cpumask_empty(cp->cpus_allowed)) {
601 			pos_css = css_rightmost_descendant(pos_css);
602 			continue;
603 		}
604 
605 		if (is_sched_load_balance(cp))
606 			update_domain_attr(dattr, cp);
607 	}
608 	rcu_read_unlock();
609 }
610 
611 /*
612  * cpuset1_generate_sched_domains()
613  *
614  * Finding the best partition (set of domains):
615  *	The double nested loops below over i, j scan over the load
616  *	balanced cpusets (using the array of cpuset pointers in csa[])
617  *	looking for pairs of cpusets that have overlapping cpus_allowed
618  *	and merging them using a union-find algorithm.
619  *
620  *	The union of the cpus_allowed masks from the set of all cpusets
621  *	having the same root then form the one element of the partition
622  *	(one sched domain) to be passed to partition_sched_domains().
623  */
cpuset1_generate_sched_domains(cpumask_var_t ** domains,struct sched_domain_attr ** attributes)624 int cpuset1_generate_sched_domains(cpumask_var_t **domains,
625 			struct sched_domain_attr **attributes)
626 {
627 	struct cpuset *cp;	/* top-down scan of cpusets */
628 	struct cpuset **csa;	/* array of all cpuset ptrs */
629 	int csn;		/* how many cpuset ptrs in csa so far */
630 	int i, j;		/* indices for partition finding loops */
631 	cpumask_var_t *doms;	/* resulting partition; i.e. sched domains */
632 	struct sched_domain_attr *dattr;  /* attributes for custom domains */
633 	int ndoms = 0;		/* number of sched domains in result */
634 	int nslot;		/* next empty doms[] struct cpumask slot */
635 	struct cgroup_subsys_state *pos_css;
636 	int nslot_update;
637 
638 	lockdep_assert_cpuset_lock_held();
639 
640 	doms = NULL;
641 	dattr = NULL;
642 	csa = NULL;
643 
644 	/* Special case for the 99% of systems with one, full, sched domain */
645 	if (is_sched_load_balance(&top_cpuset)) {
646 		ndoms = 1;
647 		doms = alloc_sched_domains(ndoms);
648 		if (!doms)
649 			goto done;
650 
651 		dattr = kmalloc_obj(struct sched_domain_attr);
652 		if (dattr) {
653 			*dattr = SD_ATTR_INIT;
654 			update_domain_attr_tree(dattr, &top_cpuset);
655 		}
656 		cpumask_and(doms[0], top_cpuset.effective_cpus,
657 			    housekeeping_cpumask(HK_TYPE_DOMAIN));
658 
659 		goto done;
660 	}
661 
662 	csa = kmalloc_objs(cp, nr_cpusets());
663 	if (!csa)
664 		goto done;
665 	csn = 0;
666 
667 	rcu_read_lock();
668 	cpuset_for_each_descendant_pre(cp, pos_css, &top_cpuset) {
669 		if (cp == &top_cpuset)
670 			continue;
671 
672 		/*
673 		 * Continue traversing beyond @cp iff @cp has some CPUs and
674 		 * isn't load balancing.  The former is obvious.  The
675 		 * latter: All child cpusets contain a subset of the
676 		 * parent's cpus, so just skip them, and then we call
677 		 * update_domain_attr_tree() to calc relax_domain_level of
678 		 * the corresponding sched domain.
679 		 */
680 		if (!cpumask_empty(cp->cpus_allowed) &&
681 		    !(is_sched_load_balance(cp) &&
682 		      cpumask_intersects(cp->cpus_allowed,
683 					 housekeeping_cpumask(HK_TYPE_DOMAIN))))
684 			continue;
685 
686 		if (is_sched_load_balance(cp) &&
687 		    !cpumask_empty(cp->effective_cpus))
688 			csa[csn++] = cp;
689 
690 		/* skip @cp's subtree */
691 		pos_css = css_rightmost_descendant(pos_css);
692 		continue;
693 	}
694 	rcu_read_unlock();
695 
696 	for (i = 0; i < csn; i++)
697 		uf_node_init(&csa[i]->node);
698 
699 	/* Merge overlapping cpusets */
700 	for (i = 0; i < csn; i++) {
701 		for (j = i + 1; j < csn; j++) {
702 			if (cpusets_overlap(csa[i], csa[j]))
703 				uf_union(&csa[i]->node, &csa[j]->node);
704 		}
705 	}
706 
707 	/* Count the total number of domains */
708 	for (i = 0; i < csn; i++) {
709 		if (uf_find(&csa[i]->node) == &csa[i]->node)
710 			ndoms++;
711 	}
712 
713 	/*
714 	 * Now we know how many domains to create.
715 	 * Convert <csn, csa> to <ndoms, doms> and populate cpu masks.
716 	 */
717 	doms = alloc_sched_domains(ndoms);
718 	if (!doms)
719 		goto done;
720 
721 	/*
722 	 * The rest of the code, including the scheduler, can deal with
723 	 * dattr==NULL case. No need to abort if alloc fails.
724 	 */
725 	dattr = kmalloc_objs(struct sched_domain_attr, ndoms);
726 
727 	for (nslot = 0, i = 0; i < csn; i++) {
728 		nslot_update = 0;
729 		for (j = i; j < csn; j++) {
730 			if (uf_find(&csa[j]->node) == &csa[i]->node) {
731 				struct cpumask *dp = doms[nslot];
732 
733 				if (i == j) {
734 					nslot_update = 1;
735 					cpumask_clear(dp);
736 					if (dattr)
737 						*(dattr + nslot) = SD_ATTR_INIT;
738 				}
739 				cpumask_or(dp, dp, csa[j]->effective_cpus);
740 				cpumask_and(dp, dp, housekeeping_cpumask(HK_TYPE_DOMAIN));
741 				if (dattr)
742 					update_domain_attr_tree(dattr + nslot, csa[j]);
743 			}
744 		}
745 		if (nslot_update)
746 			nslot++;
747 	}
748 	BUG_ON(nslot != ndoms);
749 
750 done:
751 	kfree(csa);
752 
753 	/*
754 	 * Fallback to the default domain if kmalloc() failed.
755 	 * See comments in partition_sched_domains().
756 	 */
757 	if (doms == NULL)
758 		ndoms = 1;
759 
760 	*domains    = doms;
761 	*attributes = dattr;
762 	return ndoms;
763 }
764 
765 /*
766  * for the common functions, 'private' gives the type of file
767  */
768 
769 struct cftype cpuset1_files[] = {
770 	{
771 		.name = "cpus",
772 		.seq_show = cpuset_common_seq_show,
773 		.write = cpuset_write_resmask,
774 		.max_write_len = (100U + 6 * NR_CPUS),
775 		.private = FILE_CPULIST,
776 	},
777 
778 	{
779 		.name = "mems",
780 		.seq_show = cpuset_common_seq_show,
781 		.write = cpuset_write_resmask,
782 		.max_write_len = (100U + 6 * MAX_NUMNODES),
783 		.private = FILE_MEMLIST,
784 	},
785 
786 	{
787 		.name = "effective_cpus",
788 		.seq_show = cpuset_common_seq_show,
789 		.private = FILE_EFFECTIVE_CPULIST,
790 	},
791 
792 	{
793 		.name = "effective_mems",
794 		.seq_show = cpuset_common_seq_show,
795 		.private = FILE_EFFECTIVE_MEMLIST,
796 	},
797 
798 	{
799 		.name = "cpu_exclusive",
800 		.read_u64 = cpuset_read_u64,
801 		.write_u64 = cpuset_write_u64,
802 		.private = FILE_CPU_EXCLUSIVE,
803 	},
804 
805 	{
806 		.name = "mem_exclusive",
807 		.read_u64 = cpuset_read_u64,
808 		.write_u64 = cpuset_write_u64,
809 		.private = FILE_MEM_EXCLUSIVE,
810 	},
811 
812 	{
813 		.name = "mem_hardwall",
814 		.read_u64 = cpuset_read_u64,
815 		.write_u64 = cpuset_write_u64,
816 		.private = FILE_MEM_HARDWALL,
817 	},
818 
819 	{
820 		.name = "sched_load_balance",
821 		.read_u64 = cpuset_read_u64,
822 		.write_u64 = cpuset_write_u64,
823 		.private = FILE_SCHED_LOAD_BALANCE,
824 	},
825 
826 	{
827 		.name = "sched_relax_domain_level",
828 		.read_s64 = cpuset_read_s64,
829 		.write_s64 = cpuset_write_s64,
830 		.private = FILE_SCHED_RELAX_DOMAIN_LEVEL,
831 	},
832 
833 	{
834 		.name = "memory_migrate",
835 		.read_u64 = cpuset_read_u64,
836 		.write_u64 = cpuset_write_u64,
837 		.private = FILE_MEMORY_MIGRATE,
838 	},
839 
840 	{
841 		.name = "memory_pressure",
842 		.read_u64 = cpuset_read_u64,
843 		.private = FILE_MEMORY_PRESSURE,
844 	},
845 
846 	{
847 		.name = "memory_spread_page",
848 		.read_u64 = cpuset_read_u64,
849 		.write_u64 = cpuset_write_u64,
850 		.private = FILE_SPREAD_PAGE,
851 	},
852 
853 	{
854 		/* obsolete, may be removed in the future */
855 		.name = "memory_spread_slab",
856 		.read_u64 = cpuset_read_u64,
857 		.write_u64 = cpuset_write_u64,
858 		.private = FILE_SPREAD_SLAB,
859 	},
860 
861 	{
862 		.name = "memory_pressure_enabled",
863 		.flags = CFTYPE_ONLY_ON_ROOT,
864 		.read_u64 = cpuset_read_u64,
865 		.write_u64 = cpuset_write_u64,
866 		.private = FILE_MEMORY_PRESSURE_ENABLED,
867 	},
868 
869 	{ }	/* terminate */
870 };
871