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