Commit 8449d3252c26 for kernel

commit 8449d3252c2603a51ffc7c36cb5bd94874378b7d
Merge: 2b60145734a0 b1bcaed1e39a
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Wed Dec 3 13:04:07 2025 -0800

    Merge tag 'cgroup-for-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup

    Pull cgroup updates from Tejun Heo:

     - Defer task cgroup unlink until after the dying task's final context
       switch so that controllers see the cgroup properly populated until
       the task is truly gone

     - cpuset cleanups and simplifications.

       Enforce that domain isolated CPUs stay in root or isolated partitions
       and fail if isolated+nohz_full would leave no housekeeping CPU. Fix
       sched/deadline root domain handling during CPU hot-unplug and race
       for tasks in attaching cpusets

     - Misc fixes including memory reclaim protection documentation and
       selftest KTAP conformance

    * tag 'cgroup-for-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: (21 commits)
      cpuset: Treat cpusets in attaching as populated
      sched/deadline: Walk up cpuset hierarchy to decide root domain when hot-unplug
      cgroup/cpuset: Introduce cpuset_cpus_allowed_locked()
      docs: cgroup: No special handling of unpopulated memcgs
      docs: cgroup: Note about sibling relative reclaim protection
      docs: cgroup: Explain reclaim protection target
      selftests/cgroup: conform test to KTAP format output
      cpuset: remove need_rebuild_sched_domains
      cpuset: remove global remote_children list
      cpuset: simplify node setting on error
      cgroup: include missing header for struct irq_work
      cgroup: Fix sleeping from invalid context warning on PREEMPT_RT
      cgroup/cpuset: Globally track isolated_cpus update
      cgroup/cpuset: Ensure domain isolated CPUs stay in root or isolated partition
      cgroup/cpuset: Move up prstate_housekeeping_conflict() helper
      cgroup/cpuset: Fail if isolated and nohz_full don't leave any housekeeping
      cgroup/cpuset: Rename update_unbound_workqueue_cpumask() to update_isolation_cpumasks()
      cgroup: Defer task cgroup unlink until after the task is done switching out
      cgroup: Move dying_tasks cleanup from cgroup_task_release() to cgroup_task_free()
      cgroup: Rename cgroup lifecycle hooks to cgroup_task_*()
      ...

diff --cc kernel/cgroup/cpuset.c
index 4aaad07b0bd1,1e3aadc09d3a..6e6eb09b8db6
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@@ -1388,23 -1406,85 +1406,89 @@@ static void partition_xcpus_del(int old

  	cpumask_and(xcpus, xcpus, cpu_active_mask);
  	cpumask_or(parent->effective_cpus, parent->effective_cpus, xcpus);
- 	return isolcpus_updated;
  }

- static void update_isolation_cpumasks(bool isolcpus_updated)
+ /*
+  * isolated_cpus_can_update - check for isolated & nohz_full conflicts
+  * @add_cpus: cpu mask for cpus that are going to be isolated
+  * @del_cpus: cpu mask for cpus that are no longer isolated, can be NULL
+  * Return: false if there is conflict, true otherwise
+  *
+  * If nohz_full is enabled and we have isolated CPUs, their combination must
+  * still leave housekeeping CPUs.
+  *
+  * TBD: Should consider merging this function into
+  *      prstate_housekeeping_conflict().
+  */
+ static bool isolated_cpus_can_update(struct cpumask *add_cpus,
+ 				     struct cpumask *del_cpus)
  {
- 	int ret;
+ 	cpumask_var_t full_hk_cpus;
+ 	int res = true;

- 	lockdep_assert_cpus_held();
+ 	if (!housekeeping_enabled(HK_TYPE_KERNEL_NOISE))
+ 		return true;

- 	if (!isolcpus_updated)
+ 	if (del_cpus && cpumask_weight_and(del_cpus,
+ 			housekeeping_cpumask(HK_TYPE_KERNEL_NOISE)))
+ 		return true;
+
+ 	if (!alloc_cpumask_var(&full_hk_cpus, GFP_KERNEL))
+ 		return false;
+
+ 	cpumask_and(full_hk_cpus, housekeeping_cpumask(HK_TYPE_KERNEL_NOISE),
+ 		    housekeeping_cpumask(HK_TYPE_DOMAIN));
+ 	cpumask_andnot(full_hk_cpus, full_hk_cpus, isolated_cpus);
+ 	cpumask_and(full_hk_cpus, full_hk_cpus, cpu_active_mask);
+ 	if (!cpumask_weight_andnot(full_hk_cpus, add_cpus))
+ 		res = false;
+
+ 	free_cpumask_var(full_hk_cpus);
+ 	return res;
+ }
+
+ /*
+  * prstate_housekeeping_conflict - check for partition & housekeeping conflicts
+  * @prstate: partition root state to be checked
+  * @new_cpus: cpu mask
+  * Return: true if there is conflict, false otherwise
+  *
+  * CPUs outside of boot_hk_cpus, if defined, can only be used in an
+  * isolated partition.
+  */
+ static bool prstate_housekeeping_conflict(int prstate, struct cpumask *new_cpus)
+ {
+ 	if (!have_boot_isolcpus)
+ 		return false;
+
+ 	if ((prstate != PRS_ISOLATED) && !cpumask_subset(new_cpus, boot_hk_cpus))
+ 		return true;
+
+ 	return false;
+ }
+
+ /*
+  * update_isolation_cpumasks - Update external isolation related CPU masks
+  *
+  * The following external CPU masks will be updated if necessary:
+  * - workqueue unbound cpumask
+  */
+ static void update_isolation_cpumasks(void)
+ {
+ 	int ret;
+
+ 	if (!isolated_cpus_updating)
  		return;

+ 	lockdep_assert_cpus_held();
+
  	ret = workqueue_unbound_exclude_cpumask(isolated_cpus);
  	WARN_ON_ONCE(ret < 0);
 +
 +	ret = tmigr_isolated_exclude_cpumask(isolated_cpus);
 +	WARN_ON_ONCE(ret < 0);
++
+ 	isolated_cpus_updating = false;
  }

  /**