]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Merge tag 'cgroup-for-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 Dec 2025 21:04:07 +0000 (13:04 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 Dec 2025 21:04:07 +0000 (13:04 -0800)
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_*()
  ...

1  2 
include/linux/sched.h
kernel/cgroup/cgroup.c
kernel/cgroup/cpuset.c
kernel/exit.c
kernel/fork.c
kernel/sched/core.c
kernel/sched/deadline.c
tools/testing/selftests/cgroup/test_cpu.c

Simple merge
Simple merge
index 4aaad07b0bd19ba0cccd180b5306df925bf97658,1e3aadc09d3a291f473451b172be87ab95538bf8..6e6eb09b8db6830c7157ac5a931ff82012d91e22
@@@ -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;
  }
  
  /**
diff --cc kernel/exit.c
Simple merge
diff --cc kernel/fork.c
Simple merge
Simple merge
Simple merge