css_next_descendant_pre(9)
π css_next_descendant_pre(9) β find the next descendant for pre-order walk
okay bestie, quick vibe check: this is a page from the Kernel API Manual, and it's genuinely one of those lil functions that runs the whole cgroup family tree walk. not me being dramatic β it's literally the iterator logic behind css_for_each_descendant_pre. let's go π
β¨ SYNOPSIS β¨
struct cgroup_subsys_state * css_next_descendant_pre (struct
cgroup_subsys_state *pos , struct cgroup_subsys_state *root );
like, that's the whole thing. she takes two css pointers and hands you back another one π¦
πΈ ARGUMENTS πΈ
posβ where you're standing right now, bestie. passNULLto kick off the traversal from scratch πrootβ the css whose descendants we're walking. she's the main character of this whole operation π
π DESCRIPTION π
so this one is meant to be used by css_for_each_descendant_pre β it's the lil engine that finds the next descendant to visit when you're doing a pre-order traversal of root's descendants. and yes, root is included in the iteration β she's literally the first node visited. no cap π
now, the locking tea: this function needs cgroup_mutex or RCU read locking. but listen β it does not require the whole traversal to live inside a single critical section. that's the slay part. also, you do not have to hold onto a reference to pos. π
she'll still hand you the correct next descendant as long as both pos and root are accessible and pos is a descendant of root. iconic behaviour, fr fr.
about visibility (this is the part where you gotta pay attention, bestie π«Ά): if a subsystem synchronizes ->css_online with the start of iteration, then a css that finished ->css_online is guaranteed to be visible in future iterations and will stay visible until the last reference is put. but a css that hasn't finished ->css_online, or one that already finished ->css_offline, may still show up during traversal π β it's genuinely just out there living its life. so it is each subsystem's responsibility to synchronize against on/offlining. that's the assignment, not ours β¨
lowkey important: the on/offlining synchronization is on you (well, on each subsystem). this page is very clear that it won't do it for you π
π¦ SEE ALSO π¦
Kernel file ./kernel/cgroup/cgroup.c, plus a truly unhinged amount of friends:
cgroup_ssid_enabled(9),cgroup_on_dfl(9),cgroup_e_css_by_mask(9),cgroup_e_css(9),cgroup_get_e_css(9),__cgroup_task_count(9),cgroup_task_count(9),for_each_css(9),do_each_subsys_mask(9),css_set_populated(9),css_update_populated(9),css_set_update_populated(9),css_set_move_task(9),compare_css_sets(9),find_existing_css_set(9),allocate_cgrp_cset_links(9),link_css_set(9),find_css_set(9),cgroup_file_mode(9),cgroup_calc_subtree_ss_mask(9),cgroup_kn_unlock(9),cgroup_kn_lock_live(9),css_clear_dir(9),css_populate_dir(9),cgroup_attach_lock(9),cgroup_attach_unlock(9),cgroup_migrate_add_task(9),cgroup_taskset_first(9),cgroup_taskset_next(9),cgroup_migrate_execute(9),cgroup_migrate_vet_dst(9),cgroup_migrate_finish(9),cgroup_migrate_add_src(9),cgroup_migrate_prepare_dst(9),cgroup_migrate(9),cgroup_attach_task(9),cgroup_update_dfl_csses(9),cgroup_lock_and_drain_offline(9),cgroup_save_control(9),cgroup_propagate_control(9),cgroup_restore_control(9),cgroup_apply_control_enable(9),cgroup_apply_control_disable(9),cgroup_apply_control(9),cgroup_finalize_control(9),cgroup_enable_threaded(9),cgroup_tryget_css(9),cgroup_addrm_files(9),cgroup_rm_cftypes(9),cgroup_add_cftypes(9),cgroup_add_dfl_cftypes(9),cgroup_add_legacy_cftypes(9),cgroup_file_notify(9),cgroup_file_show(9),css_next_child(9),css_rightmost_descendant(9),css_next_descendant_post(9),css_has_online_children(9),css_task_iter_advance_css_set(9),css_task_iter_start(9),css_task_iter_next(9),css_task_iter_end(9),css_create(9),kill_css_sync(9),kill_css_finish(9),cgroup_destroy_locked(9),cgroup_init_early(9),cgroup_init(9),cgroup_fork(9),cgroup_v1v2_get_from_file(9),cgroup_get_from_file(9),cgroup_css_set_fork(9),cgroup_css_set_put_fork(9),cgroup_can_fork(9),cgroup_cancel_fork(9),cgroup_post_fork(9),cgroup_task_exit(9),css_tryget_online_from_dir(9),css_from_id(9),cgroup_get_from_path(9),cgroup_v1v2_get_from_fd(9),cgroup_get_from_fd(9),cgroup_parse_float(9)
likeβ¦ that's a whole group chat right there ππ
mwah, that's the page π this lil baddie lives in ./kernel/cgroup and the docs are dated October 2026 β go forth and walk those descendants in pre-order, bestie, you've got this π«Άβ¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms