cgroup_migrate(9)
π cgroup_migrate(9) β like, the whole "move a task into a cgroup" moment
okay so this is cgroup_migrate(9), straight out of the Kernel API Manual (section 9, kernel-space girlies only π). it's short, it's sweet, it does exactly one thing, and it wants you to have done your homework first. let's get into it bestie β¨
πΈ NAME πΈ
cgroup_migrate β migrate a process or task to a cgroup
like, literally just moving a process (or one lone task) into a cgroup. that's the whole vibe. no cap. π¦
β¨ SYNOPSIS β¨
int cgroup_migrate (struct task_struct *leader , bool threadgroup ,
struct cgroup_mgctx *mgctx );
that's the whole signature, copy it exactly okay π€ β she's an int, so bestie will be returning something to you.
π«Ά ARGUMENTS π«Ά
leaderβ the leader of the process, or the task you want to migrate. main character energy: whoever you point at is the one getting moved πthreadgroupβ aboolthat tells her whetherleaderpoints to the whole process (true-ish vibe) or just a single task. choose wisely, it changes who's coming with you πmgctxβ the migration context. the little backpack of state she carries through the whole operation π
π₯ DESCRIPTION π₯
So. You want to migrate a process or a task, and leader is your girl. easy, right? not so fast bestie π
If you're migrating a process, the caller must be holding cgroup_threadgroup_rwsem. that's not a suggestion, that's a hard requirement. hold the semaphore. periodt.
you're also responsible for the rest of the choreography, and she will not do it for you:
- invoke
cgroup_migrate_add_srcon the targets first - invoke
cgroup_migrate_prepare_dston the targets - then call this function
- and follow up with
cgroup_migrate_finishafterward π
it's giving "the function is the middle of a sandwich and you gotta bring the bread."
here's the iconic part π: as long as a controller's ->can_attach doesn't fail, and a CGROUP_TASK_MIGRATING notification doesn't fail, this function is guaranteed to succeed. guaranteed. no cap.
which means β excluding those two failure sources β when you're migrating multiple targets, you can figure out success-or-failure for all of them up front by invoking group_migrate_prepare_dst before you actually start migrating. decide the fate of the entire group before the party even starts. obsessed. π
π SEE ALSO π
the kernel file in question is ./kernel/cgroup/cgroup.c, and honestly here's the whole friend group π«Ά:
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_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_next_descendant_pre(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)
iykyk π that's a lot of cross-references and every single one of them matters.
β οΈ reminder bestie: holdcgroup_threadgroup_rwsemwhen migrating a process, and don't forgetcgroup_migrate_add_src+cgroup_migrate_prepare_dstbefore andcgroup_migrate_finishafter. skipping steps is not the move π
okay that's the page!! this little cutie lives in ./kernel/cgroup and the doc is dated October 2026 β go forth and migrate responsibly, mwah ππ§ββοΈ
π¦ 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