Lines Matching refs:cgrp

190 static int cgroup_destroy_locked(struct cgroup *cgrp);
191 static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss,
195 static int cgroup_addrm_files(struct cgroup *cgrp, struct cftype cfts[],
229 static struct cgroup *cgroup_parent(struct cgroup *cgrp) in cgroup_parent() argument
231 struct cgroup_subsys_state *parent_css = cgrp->self.parent; in cgroup_parent()
249 static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp, in cgroup_css() argument
253 return rcu_dereference_check(cgrp->subsys[ss->id], in cgroup_css()
256 return &cgrp->self; in cgroup_css()
269 static struct cgroup_subsys_state *cgroup_e_css(struct cgroup *cgrp, in cgroup_e_css() argument
275 return &cgrp->self; in cgroup_e_css()
277 if (!(cgrp->root->subsys_mask & (1 << ss->id))) in cgroup_e_css()
284 while (cgroup_parent(cgrp) && in cgroup_e_css()
285 !(cgroup_parent(cgrp)->child_subsys_mask & (1 << ss->id))) in cgroup_e_css()
286 cgrp = cgroup_parent(cgrp); in cgroup_e_css()
288 return cgroup_css(cgrp, ss); in cgroup_e_css()
302 struct cgroup_subsys_state *cgroup_get_e_css(struct cgroup *cgrp, in cgroup_get_e_css() argument
310 css = cgroup_css(cgrp, ss); in cgroup_get_e_css()
314 cgrp = cgroup_parent(cgrp); in cgroup_get_e_css()
315 } while (cgrp); in cgroup_get_e_css()
325 static inline bool cgroup_is_dead(const struct cgroup *cgrp) in cgroup_is_dead() argument
327 return !(cgrp->self.flags & CSS_ONLINE); in cgroup_is_dead()
332 struct cgroup *cgrp = of->kn->parent->priv; in of_css() local
344 return rcu_dereference_raw(cgrp->subsys[cft->ss->id]); in of_css()
346 return &cgrp->self; in of_css()
359 bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor) in cgroup_is_descendant() argument
361 while (cgrp) { in cgroup_is_descendant()
362 if (cgrp == ancestor) in cgroup_is_descendant()
364 cgrp = cgroup_parent(cgrp); in cgroup_is_descendant()
369 static int notify_on_release(const struct cgroup *cgrp) in notify_on_release() argument
371 return test_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); in notify_on_release()
382 #define for_each_css(css, ssid, cgrp) \ argument
385 (cgrp)->subsys[(ssid)], \
397 #define for_each_e_css(css, ssid, cgrp) \ argument
399 if (!((css) = cgroup_e_css(cgrp, cgroup_subsys[(ssid)]))) \
417 #define cgroup_for_each_live_child(child, cgrp) \ argument
418 list_for_each_entry((child), &(cgrp)->self.children, self.sibling) \
425 static void check_for_release(struct cgroup *cgrp);
437 struct cgroup *cgrp; member
481 static void cgroup_update_populated(struct cgroup *cgrp, bool populated) in cgroup_update_populated() argument
489 trigger = !cgrp->populated_cnt++; in cgroup_update_populated()
491 trigger = !--cgrp->populated_cnt; in cgroup_update_populated()
496 if (cgrp->populated_kn) in cgroup_update_populated()
497 kernfs_notify(cgrp->populated_kn); in cgroup_update_populated()
498 cgrp = cgroup_parent(cgrp); in cgroup_update_populated()
499 } while (cgrp); in cgroup_update_populated()
541 struct cgroup *cgrp = link->cgrp; in put_css_set_locked() local
547 if (list_empty(&cgrp->cset_links)) { in put_css_set_locked()
548 cgroup_update_populated(cgrp, false); in put_css_set_locked()
549 check_for_release(cgrp); in put_css_set_locked()
630 cgrp1 = link1->cgrp; in compare_css_sets()
631 cgrp2 = link2->cgrp; in compare_css_sets()
660 struct cgroup *cgrp, in find_existing_css_set() argument
663 struct cgroup_root *root = cgrp->root; in find_existing_css_set()
680 template[i] = cgroup_e_css(cgrp, ss); in find_existing_css_set()
692 if (!compare_css_sets(cset, old_cset, cgrp, template)) in find_existing_css_set()
746 struct cgroup *cgrp) in link_css_set() argument
752 if (cgroup_on_dfl(cgrp)) in link_css_set()
753 cset->dfl_cgrp = cgrp; in link_css_set()
757 link->cgrp = cgrp; in link_css_set()
759 if (list_empty(&cgrp->cset_links)) in link_css_set()
760 cgroup_update_populated(cgrp, true); in link_css_set()
761 list_move(&link->cset_link, &cgrp->cset_links); in link_css_set()
779 struct cgroup *cgrp) in find_css_set() argument
794 cset = find_existing_css_set(old_cset, cgrp, template); in find_css_set()
827 struct cgroup *c = link->cgrp; in find_css_set()
829 if (c->root == cgrp->root) in find_css_set()
830 c = cgrp; in find_css_set()
895 struct cgroup *cgrp = &root->cgrp; in cgroup_destroy_root() local
901 BUG_ON(!list_empty(&cgrp->self.children)); in cgroup_destroy_root()
912 list_for_each_entry_safe(link, tmp_link, &cgrp->cset_links, cset_link) { in cgroup_destroy_root()
942 res = &root->cgrp; in cset_cgroup_from_root()
947 struct cgroup *c = link->cgrp; in cset_cgroup_from_root()
1001 static int cgroup_populate_dir(struct cgroup *cgrp, unsigned int subsys_mask);
1005 static char *cgroup_file_name(struct cgroup *cgrp, const struct cftype *cft, in cgroup_file_name() argument
1009 !(cgrp->root->flags & CGRP_ROOT_NOPREFIX)) in cgroup_file_name()
1042 static void cgroup_get(struct cgroup *cgrp) in cgroup_get() argument
1044 WARN_ON_ONCE(cgroup_is_dead(cgrp)); in cgroup_get()
1045 css_get(&cgrp->self); in cgroup_get()
1048 static bool cgroup_tryget(struct cgroup *cgrp) in cgroup_tryget() argument
1050 return css_tryget(&cgrp->self); in cgroup_tryget()
1053 static void cgroup_put(struct cgroup *cgrp) in cgroup_put() argument
1055 css_put(&cgrp->self); in cgroup_put()
1071 static unsigned int cgroup_calc_child_subsys_mask(struct cgroup *cgrp, in cgroup_calc_child_subsys_mask() argument
1074 struct cgroup *parent = cgroup_parent(cgrp); in cgroup_calc_child_subsys_mask()
1081 if (!cgroup_on_dfl(cgrp)) in cgroup_calc_child_subsys_mask()
1099 new_ss_mask &= cgrp->root->subsys_mask; in cgroup_calc_child_subsys_mask()
1116 static void cgroup_refresh_child_subsys_mask(struct cgroup *cgrp) in cgroup_refresh_child_subsys_mask() argument
1118 cgrp->child_subsys_mask = in cgroup_refresh_child_subsys_mask()
1119 cgroup_calc_child_subsys_mask(cgrp, cgrp->subtree_control); in cgroup_refresh_child_subsys_mask()
1134 struct cgroup *cgrp; in cgroup_kn_unlock() local
1137 cgrp = kn->priv; in cgroup_kn_unlock()
1139 cgrp = kn->parent->priv; in cgroup_kn_unlock()
1144 cgroup_put(cgrp); in cgroup_kn_unlock()
1164 struct cgroup *cgrp; in cgroup_kn_lock_live() local
1167 cgrp = kn->priv; in cgroup_kn_lock_live()
1169 cgrp = kn->parent->priv; in cgroup_kn_lock_live()
1177 if (!cgroup_tryget(cgrp)) in cgroup_kn_lock_live()
1183 if (!cgroup_is_dead(cgrp)) in cgroup_kn_lock_live()
1184 return cgrp; in cgroup_kn_lock_live()
1190 static void cgroup_rm_file(struct cgroup *cgrp, const struct cftype *cft) in cgroup_rm_file() argument
1195 kernfs_remove_by_name(cgrp->kn, cgroup_file_name(cgrp, cft, name)); in cgroup_rm_file()
1203 static void cgroup_clear_dir(struct cgroup *cgrp, unsigned int subsys_mask) in cgroup_clear_dir() argument
1214 cgroup_addrm_files(cgrp, cfts, false); in cgroup_clear_dir()
1231 if (css_next_child(NULL, cgroup_css(&ss->root->cgrp, ss))) in rebind_subsystems()
1244 ret = cgroup_populate_dir(&dst_root->cgrp, tmp_ss_mask); in rebind_subsystems()
1268 cgroup_clear_dir(&ss->root->cgrp, 1 << ssid); in rebind_subsystems()
1279 css = cgroup_css(&src_root->cgrp, ss); in rebind_subsystems()
1281 WARN_ON(!css || cgroup_css(&dst_root->cgrp, ss)); in rebind_subsystems()
1283 RCU_INIT_POINTER(src_root->cgrp.subsys[ssid], NULL); in rebind_subsystems()
1284 rcu_assign_pointer(dst_root->cgrp.subsys[ssid], css); in rebind_subsystems()
1286 css->cgroup = &dst_root->cgrp; in rebind_subsystems()
1291 &dst_root->cgrp.e_csets[ss->id]); in rebind_subsystems()
1295 src_root->cgrp.subtree_control &= ~(1 << ssid); in rebind_subsystems()
1296 cgroup_refresh_child_subsys_mask(&src_root->cgrp); in rebind_subsystems()
1301 dst_root->cgrp.subtree_control |= 1 << ssid; in rebind_subsystems()
1302 cgroup_refresh_child_subsys_mask(&dst_root->cgrp); in rebind_subsystems()
1309 kernfs_activate(dst_root->cgrp.kn); in rebind_subsystems()
1334 if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->cgrp.flags)) in cgroup_show_options()
1530 if (!list_empty(&root->cgrp.self.children)) { in cgroup_remount()
1605 static void init_cgroup_housekeeping(struct cgroup *cgrp) in init_cgroup_housekeeping() argument
1610 INIT_LIST_HEAD(&cgrp->self.sibling); in init_cgroup_housekeeping()
1611 INIT_LIST_HEAD(&cgrp->self.children); in init_cgroup_housekeeping()
1612 INIT_LIST_HEAD(&cgrp->cset_links); in init_cgroup_housekeeping()
1613 INIT_LIST_HEAD(&cgrp->pidlists); in init_cgroup_housekeeping()
1614 mutex_init(&cgrp->pidlist_mutex); in init_cgroup_housekeeping()
1615 cgrp->self.cgroup = cgrp; in init_cgroup_housekeeping()
1616 cgrp->self.flags |= CSS_ONLINE; in init_cgroup_housekeeping()
1619 INIT_LIST_HEAD(&cgrp->e_csets[ssid]); in init_cgroup_housekeeping()
1621 init_waitqueue_head(&cgrp->offline_waitq); in init_cgroup_housekeeping()
1622 INIT_WORK(&cgrp->release_agent_work, cgroup_release_agent); in init_cgroup_housekeeping()
1628 struct cgroup *cgrp = &root->cgrp; in init_cgroup_root() local
1632 cgrp->root = root; in init_cgroup_root()
1633 init_cgroup_housekeeping(cgrp); in init_cgroup_root()
1642 set_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->cgrp.flags); in init_cgroup_root()
1648 struct cgroup *root_cgrp = &root->cgrp; in cgroup_setup_root()
1768 cgroup_get(&root->cgrp); in cgroup_mount()
1785 if (!percpu_ref_tryget_live(&ss->root->cgrp.self.refcnt)) { in cgroup_mount()
1791 cgroup_put(&ss->root->cgrp); in cgroup_mount()
1840 !percpu_ref_tryget_live(&root->cgrp.self.refcnt)) { in cgroup_mount()
1887 cgroup_put(&root->cgrp); in cgroup_mount()
1913 if (!list_empty(&root->cgrp.self.children) || in cgroup_kill_sb()
1915 cgroup_put(&root->cgrp); in cgroup_kill_sb()
1917 percpu_ref_kill(&root->cgrp.self.refcnt); in cgroup_kill_sb()
1944 struct cgroup *cgrp; in task_cgroup_path() local
1954 cgrp = task_cgroup_from_root(task, root); in task_cgroup_path()
1955 path = cgroup_path(cgrp, buf, buflen); in task_cgroup_path()
2230 static int cgroup_migrate(struct cgroup *cgrp, struct task_struct *leader, in cgroup_migrate() argument
2286 for_each_e_css(css, i, cgrp) { in cgroup_migrate()
2316 for_each_e_css(css, i, cgrp) in cgroup_migrate()
2324 for_each_e_css(css, i, cgrp) { in cgroup_migrate()
2388 struct cgroup *cgrp; in __cgroup_procs_write() local
2395 cgrp = cgroup_kn_lock_live(of->kn); in __cgroup_procs_write()
2396 if (!cgrp) in __cgroup_procs_write()
2456 ret = cgroup_attach_task(cgrp, tsk, threadgroup); in __cgroup_procs_write()
2512 struct cgroup *cgrp; in cgroup_release_agent_write() local
2514 BUILD_BUG_ON(sizeof(cgrp->root->release_agent_path) < PATH_MAX); in cgroup_release_agent_write()
2516 cgrp = cgroup_kn_lock_live(of->kn); in cgroup_release_agent_write()
2517 if (!cgrp) in cgroup_release_agent_write()
2520 strlcpy(cgrp->root->release_agent_path, strstrip(buf), in cgroup_release_agent_write()
2521 sizeof(cgrp->root->release_agent_path)); in cgroup_release_agent_write()
2529 struct cgroup *cgrp = seq_css(seq)->cgroup; in cgroup_release_agent_show() local
2532 seq_puts(seq, cgrp->root->release_agent_path); in cgroup_release_agent_show()
2565 struct cgroup *cgrp = seq_css(seq)->cgroup; in cgroup_root_controllers_show() local
2567 cgroup_print_ss_mask(seq, cgrp->root->subsys_mask & in cgroup_root_controllers_show()
2575 struct cgroup *cgrp = seq_css(seq)->cgroup; in cgroup_controllers_show() local
2577 cgroup_print_ss_mask(seq, cgroup_parent(cgrp)->subtree_control); in cgroup_controllers_show()
2584 struct cgroup *cgrp = seq_css(seq)->cgroup; in cgroup_subtree_control_show() local
2586 cgroup_print_ss_mask(seq, cgrp->subtree_control); in cgroup_subtree_control_show()
2599 static int cgroup_update_dfl_csses(struct cgroup *cgrp) in cgroup_update_dfl_csses() argument
2610 css_for_each_descendant_pre(css, cgroup_css(cgrp, NULL)) { in cgroup_update_dfl_csses()
2614 if (css->cgroup == cgrp) in cgroup_update_dfl_csses()
2618 cgroup_migrate_add_src(link->cset, cgrp, in cgroup_update_dfl_csses()
2693 struct cgroup *cgrp, *child; in cgroup_subtree_control_write() local
2726 cgrp = cgroup_kn_lock_live(of->kn); in cgroup_subtree_control_write()
2727 if (!cgrp) in cgroup_subtree_control_write()
2732 if (cgrp->subtree_control & (1 << ssid)) { in cgroup_subtree_control_write()
2739 (cgroup_parent(cgrp) && in cgroup_subtree_control_write()
2740 !(cgroup_parent(cgrp)->subtree_control & (1 << ssid)))) { in cgroup_subtree_control_write()
2745 if (!(cgrp->subtree_control & (1 << ssid))) { in cgroup_subtree_control_write()
2751 cgroup_for_each_live_child(child, cgrp) { in cgroup_subtree_control_write()
2769 if (enable && cgroup_parent(cgrp) && !list_empty(&cgrp->cset_links)) { in cgroup_subtree_control_write()
2779 old_sc = cgrp->subtree_control; in cgroup_subtree_control_write()
2780 old_ss = cgrp->child_subsys_mask; in cgroup_subtree_control_write()
2782 new_ss = cgroup_calc_child_subsys_mask(cgrp, new_sc); in cgroup_subtree_control_write()
2799 cgroup_for_each_live_child(child, cgrp) { in cgroup_subtree_control_write()
2817 cgrp->subtree_control = new_sc; in cgroup_subtree_control_write()
2818 cgrp->child_subsys_mask = new_ss; in cgroup_subtree_control_write()
2830 cgroup_for_each_live_child(child, cgrp) { in cgroup_subtree_control_write()
2833 cgrp->subtree_control & (1 << ssid)); in cgroup_subtree_control_write()
2846 ret = cgroup_update_dfl_csses(cgrp); in cgroup_subtree_control_write()
2862 cgroup_for_each_live_child(child, cgrp) { in cgroup_subtree_control_write()
2882 struct cgroup_subsys_state *this_css = cgroup_css(cgrp, ss); in cgroup_subtree_control_write()
2893 kernfs_activate(cgrp->kn); in cgroup_subtree_control_write()
2900 cgrp->subtree_control = old_sc; in cgroup_subtree_control_write()
2901 cgrp->child_subsys_mask = old_ss; in cgroup_subtree_control_write()
2907 cgroup_for_each_live_child(child, cgrp) { in cgroup_subtree_control_write()
2931 struct cgroup *cgrp = of->kn->parent->priv; in cgroup_file_write() local
2946 css = cgroup_css(cgrp, cft->ss); in cgroup_file_write()
3019 struct cgroup *cgrp = kn->priv; in cgroup_rename() local
3031 if (cgroup_on_dfl(cgrp)) in cgroup_rename()
3067 static int cgroup_add_file(struct cgroup *cgrp, struct cftype *cft) in cgroup_add_file() argument
3077 kn = __kernfs_create_file(cgrp->kn, cgroup_file_name(cgrp, cft, name), in cgroup_add_file()
3090 cgrp->populated_kn = kn; in cgroup_add_file()
3105 static int cgroup_addrm_files(struct cgroup *cgrp, struct cftype cfts[], in cgroup_addrm_files() argument
3115 if ((cft->flags & __CFTYPE_ONLY_ON_DFL) && !cgroup_on_dfl(cgrp)) in cgroup_addrm_files()
3117 if ((cft->flags & __CFTYPE_NOT_ON_DFL) && cgroup_on_dfl(cgrp)) in cgroup_addrm_files()
3119 if ((cft->flags & CFTYPE_NOT_ON_ROOT) && !cgroup_parent(cgrp)) in cgroup_addrm_files()
3121 if ((cft->flags & CFTYPE_ONLY_ON_ROOT) && cgroup_parent(cgrp)) in cgroup_addrm_files()
3125 ret = cgroup_add_file(cgrp, cft); in cgroup_addrm_files()
3132 cgroup_rm_file(cgrp, cft); in cgroup_addrm_files()
3142 struct cgroup *root = &ss->root->cgrp; in cgroup_apply_cftypes()
3150 struct cgroup *cgrp = css->cgroup; in cgroup_apply_cftypes() local
3152 if (cgroup_is_dead(cgrp)) in cgroup_apply_cftypes()
3155 ret = cgroup_addrm_files(cgrp, cfts, is_add); in cgroup_apply_cftypes()
3337 static int cgroup_task_count(const struct cgroup *cgrp) in cgroup_task_count() argument
3343 list_for_each_entry(link, &cgrp->cset_links, cset_link) in cgroup_task_count()
3815 static void cgroup_pidlist_destroy_all(struct cgroup *cgrp) in cgroup_pidlist_destroy_all() argument
3819 mutex_lock(&cgrp->pidlist_mutex); in cgroup_pidlist_destroy_all()
3820 list_for_each_entry_safe(l, tmp_l, &cgrp->pidlists, links) in cgroup_pidlist_destroy_all()
3822 mutex_unlock(&cgrp->pidlist_mutex); in cgroup_pidlist_destroy_all()
3825 BUG_ON(!list_empty(&cgrp->pidlists)); in cgroup_pidlist_destroy_all()
3908 static pid_t cgroup_pid_fry(struct cgroup *cgrp, pid_t pid) in cgroup_pid_fry() argument
3910 if (cgroup_on_dfl(cgrp)) in cgroup_pid_fry()
3926 static struct cgroup_pidlist *cgroup_pidlist_find(struct cgroup *cgrp, in cgroup_pidlist_find() argument
3933 lockdep_assert_held(&cgrp->pidlist_mutex); in cgroup_pidlist_find()
3935 list_for_each_entry(l, &cgrp->pidlists, links) in cgroup_pidlist_find()
3947 static struct cgroup_pidlist *cgroup_pidlist_find_create(struct cgroup *cgrp, in cgroup_pidlist_find_create() argument
3952 lockdep_assert_held(&cgrp->pidlist_mutex); in cgroup_pidlist_find_create()
3954 l = cgroup_pidlist_find(cgrp, type); in cgroup_pidlist_find_create()
3967 l->owner = cgrp; in cgroup_pidlist_find_create()
3968 list_add(&l->links, &cgrp->pidlists); in cgroup_pidlist_find_create()
3975 static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type, in pidlist_array_load() argument
3985 lockdep_assert_held(&cgrp->pidlist_mutex); in pidlist_array_load()
3993 length = cgroup_task_count(cgrp); in pidlist_array_load()
3998 css_task_iter_start(&cgrp->self, &it); in pidlist_array_load()
4013 if (cgroup_on_dfl(cgrp)) in pidlist_array_load()
4020 l = cgroup_pidlist_find_create(cgrp, type); in pidlist_array_load()
4046 struct cgroup *cgrp; in cgroupstats_build() local
4063 cgrp = rcu_dereference(kn->priv); in cgroupstats_build()
4064 if (!cgrp || cgroup_is_dead(cgrp)) { in cgroupstats_build()
4071 css_task_iter_start(&cgrp->self, &it); in cgroupstats_build()
4114 struct cgroup *cgrp = seq_css(s)->cgroup; in cgroup_pidlist_start() local
4120 mutex_lock(&cgrp->pidlist_mutex); in cgroup_pidlist_start()
4129 of->priv = cgroup_pidlist_find(cgrp, type); in cgroup_pidlist_start()
4136 ret = pidlist_array_load(cgrp, type, in cgroup_pidlist_start()
4148 if (cgroup_pid_fry(cgrp, l->list[mid]) == pid) { in cgroup_pidlist_start()
4151 } else if (cgroup_pid_fry(cgrp, l->list[mid]) <= pid) in cgroup_pidlist_start()
4162 *pos = cgroup_pid_fry(cgrp, *iter); in cgroup_pidlist_start()
4324 static int cgroup_populate_dir(struct cgroup *cgrp, unsigned int subsys_mask) in cgroup_populate_dir() argument
4337 ret = cgroup_addrm_files(cgrp, cfts, true); in cgroup_populate_dir()
4344 cgroup_clear_dir(cgrp, subsys_mask); in cgroup_populate_dir()
4375 struct cgroup *cgrp = css->cgroup; in css_free_work_fn() local
4388 cgroup_put(cgrp); in css_free_work_fn()
4391 atomic_dec(&cgrp->root->nr_cgrps); in css_free_work_fn()
4392 cgroup_pidlist_destroy_all(cgrp); in css_free_work_fn()
4393 cancel_work_sync(&cgrp->release_agent_work); in css_free_work_fn()
4395 if (cgroup_parent(cgrp)) { in css_free_work_fn()
4402 cgroup_put(cgroup_parent(cgrp)); in css_free_work_fn()
4403 kernfs_put(cgrp->kn); in css_free_work_fn()
4404 kfree(cgrp); in css_free_work_fn()
4411 cgroup_destroy_root(cgrp->root); in css_free_work_fn()
4430 struct cgroup *cgrp = css->cgroup; in css_release_work_fn() local
4444 cgroup_idr_remove(&cgrp->root->cgroup_idr, cgrp->id); in css_release_work_fn()
4445 cgrp->id = -1; in css_release_work_fn()
4454 RCU_INIT_POINTER(*(void __rcu __force **)&cgrp->kn->priv, NULL); in css_release_work_fn()
4472 struct cgroup_subsys *ss, struct cgroup *cgrp) in init_and_link_css() argument
4476 cgroup_get(cgrp); in init_and_link_css()
4479 css->cgroup = cgrp; in init_and_link_css()
4486 if (cgroup_parent(cgrp)) { in init_and_link_css()
4487 css->parent = cgroup_css(cgroup_parent(cgrp), ss); in init_and_link_css()
4491 BUG_ON(cgroup_css(cgrp, ss)); in init_and_link_css()
4544 static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss, in create_css() argument
4547 struct cgroup *parent = cgroup_parent(cgrp); in create_css()
4558 init_and_link_css(css, ss, cgrp); in create_css()
4570 err = cgroup_populate_dir(cgrp, 1 << ss->id); in create_css()
4609 struct cgroup *parent, *cgrp; in cgroup_mkdir() local
4627 cgrp = kzalloc(sizeof(*cgrp), GFP_KERNEL); in cgroup_mkdir()
4628 if (!cgrp) { in cgroup_mkdir()
4633 ret = percpu_ref_init(&cgrp->self.refcnt, css_release, 0, GFP_KERNEL); in cgroup_mkdir()
4641 cgrp->id = cgroup_idr_alloc(&root->cgroup_idr, NULL, 2, 0, GFP_NOWAIT); in cgroup_mkdir()
4642 if (cgrp->id < 0) { in cgroup_mkdir()
4647 init_cgroup_housekeeping(cgrp); in cgroup_mkdir()
4649 cgrp->self.parent = &parent->self; in cgroup_mkdir()
4650 cgrp->root = root; in cgroup_mkdir()
4653 set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); in cgroup_mkdir()
4656 set_bit(CGRP_CPUSET_CLONE_CHILDREN, &cgrp->flags); in cgroup_mkdir()
4659 kn = kernfs_create_dir(parent->kn, name, mode, cgrp); in cgroup_mkdir()
4664 cgrp->kn = kn; in cgroup_mkdir()
4672 cgrp->self.serial_nr = css_serial_nr_next++; in cgroup_mkdir()
4675 list_add_tail_rcu(&cgrp->self.sibling, &cgroup_parent(cgrp)->self.children); in cgroup_mkdir()
4683 cgroup_idr_replace(&root->cgroup_idr, cgrp, cgrp->id); in cgroup_mkdir()
4689 if (cgroup_on_dfl(cgrp)) in cgroup_mkdir()
4694 ret = cgroup_addrm_files(cgrp, base_files, true); in cgroup_mkdir()
4701 ret = create_css(cgrp, ss, in cgroup_mkdir()
4712 if (!cgroup_on_dfl(cgrp)) { in cgroup_mkdir()
4713 cgrp->subtree_control = parent->subtree_control; in cgroup_mkdir()
4714 cgroup_refresh_child_subsys_mask(cgrp); in cgroup_mkdir()
4723 cgroup_idr_remove(&root->cgroup_idr, cgrp->id); in cgroup_mkdir()
4725 percpu_ref_exit(&cgrp->self.refcnt); in cgroup_mkdir()
4727 kfree(cgrp); in cgroup_mkdir()
4733 cgroup_destroy_locked(cgrp); in cgroup_mkdir()
4833 static int cgroup_destroy_locked(struct cgroup *cgrp) in cgroup_destroy_locked() argument
4847 empty = list_empty(&cgrp->cset_links); in cgroup_destroy_locked()
4857 if (css_has_online_children(&cgrp->self)) in cgroup_destroy_locked()
4864 cgrp->self.flags &= ~CSS_ONLINE; in cgroup_destroy_locked()
4867 for_each_css(css, ssid, cgrp) in cgroup_destroy_locked()
4874 kernfs_remove(cgrp->kn); in cgroup_destroy_locked()
4876 check_for_release(cgroup_parent(cgrp)); in cgroup_destroy_locked()
4879 percpu_ref_kill(&cgrp->self.refcnt); in cgroup_destroy_locked()
4886 struct cgroup *cgrp; in cgroup_rmdir() local
4889 cgrp = cgroup_kn_lock_live(kn); in cgroup_rmdir()
4890 if (!cgrp) in cgroup_rmdir()
4893 ret = cgroup_destroy_locked(cgrp); in cgroup_rmdir()
4920 css = ss->css_alloc(cgroup_css(&cgrp_dfl_root.cgrp, ss)); in cgroup_init_subsys()
4923 init_and_link_css(css, ss, &cgrp_dfl_root.cgrp); in cgroup_init_subsys()
4970 cgrp_dfl_root.cgrp.self.flags |= CSS_NO_REF; in cgroup_init_early()
5029 &cgrp_dfl_root.cgrp.e_csets[ssid]); in cgroup_init()
5119 struct cgroup *cgrp; in proc_cgroup_show() local
5133 cgrp = task_cgroup_from_root(tsk, root); in proc_cgroup_show()
5134 path = cgroup_path(cgrp, buf, PATH_MAX); in proc_cgroup_show()
5319 static void check_for_release(struct cgroup *cgrp) in check_for_release() argument
5321 if (notify_on_release(cgrp) && !cgroup_has_tasks(cgrp) && in check_for_release()
5322 !css_has_online_children(&cgrp->self) && !cgroup_is_dead(cgrp)) in check_for_release()
5323 schedule_work(&cgrp->release_agent_work); in check_for_release()
5351 struct cgroup *cgrp = in cgroup_release_agent() local
5359 agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL); in cgroup_release_agent()
5363 path = cgroup_path(cgrp, pathbuf, PATH_MAX); in cgroup_release_agent()
5431 struct cgroup *cgrp; in css_tryget_online_from_dir() local
5445 cgrp = rcu_dereference(kn->priv); in css_tryget_online_from_dir()
5446 if (cgrp) in css_tryget_online_from_dir()
5447 css = cgroup_css(cgrp, ss); in css_tryget_online_from_dir()
5524 struct cgroup *c = link->cgrp; in current_css_set_cg_links_read()