Skip to content

Commit

Permalink
Merge tag 'cgroup-for-6.14-rc2-fixes' of git://git.kernel.org/pub/scm…
Browse files Browse the repository at this point in the history
…/linux/kernel/git/tj/cgroup

Pull cgroup fixes from Tejun Heo:

 - Fix a race window where a newly forked task could escape cgroup.kill

 - Remove incorrectly included steal time from cpu.stat::usage_usec

 - Minor update in selftest

* tag 'cgroup-for-6.14-rc2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup:
  cgroup: Remove steal time from usage_usec
  selftests/cgroup: use bash in test_cpuset_v1_hp.sh
  cgroup: fix race between fork and cgroup.kill
  • Loading branch information
torvalds committed Feb 14, 2025
2 parents f4d4680 + db5fd3c commit 80868f5
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 13 deletions.
6 changes: 3 additions & 3 deletions include/linux/cgroup-defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,6 @@ enum {

/* Cgroup is frozen. */
CGRP_FROZEN,

/* Control group has to be killed. */
CGRP_KILL,
};

/* cgroup_root->flags */
Expand Down Expand Up @@ -461,6 +458,9 @@ struct cgroup {

int nr_threaded_children; /* # of live threaded child cgroups */

/* sequence number for cgroup.kill, serialized by css_set_lock. */
unsigned int kill_seq;

struct kernfs_node *kn; /* cgroup kernfs entry */
struct cgroup_file procs_file; /* handle for "cgroup.procs" */
struct cgroup_file events_file; /* handle for "cgroup.events" */
Expand Down
1 change: 1 addition & 0 deletions include/linux/sched/task.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ struct kernel_clone_args {
void *fn_arg;
struct cgroup *cgrp;
struct css_set *cset;
unsigned int kill_seq;
};

/*
Expand Down
20 changes: 12 additions & 8 deletions kernel/cgroup/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -4013,7 +4013,7 @@ static void __cgroup_kill(struct cgroup *cgrp)
lockdep_assert_held(&cgroup_mutex);

spin_lock_irq(&css_set_lock);
set_bit(CGRP_KILL, &cgrp->flags);
cgrp->kill_seq++;
spin_unlock_irq(&css_set_lock);

css_task_iter_start(&cgrp->self, CSS_TASK_ITER_PROCS | CSS_TASK_ITER_THREADED, &it);
Expand All @@ -4029,10 +4029,6 @@ static void __cgroup_kill(struct cgroup *cgrp)
send_sig(SIGKILL, task, 0);
}
css_task_iter_end(&it);

spin_lock_irq(&css_set_lock);
clear_bit(CGRP_KILL, &cgrp->flags);
spin_unlock_irq(&css_set_lock);
}

static void cgroup_kill(struct cgroup *cgrp)
Expand Down Expand Up @@ -6488,6 +6484,10 @@ static int cgroup_css_set_fork(struct kernel_clone_args *kargs)
spin_lock_irq(&css_set_lock);
cset = task_css_set(current);
get_css_set(cset);
if (kargs->cgrp)
kargs->kill_seq = kargs->cgrp->kill_seq;
else
kargs->kill_seq = cset->dfl_cgrp->kill_seq;
spin_unlock_irq(&css_set_lock);

if (!(kargs->flags & CLONE_INTO_CGROUP)) {
Expand Down Expand Up @@ -6668,6 +6668,7 @@ void cgroup_post_fork(struct task_struct *child,
struct kernel_clone_args *kargs)
__releases(&cgroup_threadgroup_rwsem) __releases(&cgroup_mutex)
{
unsigned int cgrp_kill_seq = 0;
unsigned long cgrp_flags = 0;
bool kill = false;
struct cgroup_subsys *ss;
Expand All @@ -6681,10 +6682,13 @@ void cgroup_post_fork(struct task_struct *child,

/* init tasks are special, only link regular threads */
if (likely(child->pid)) {
if (kargs->cgrp)
if (kargs->cgrp) {
cgrp_flags = kargs->cgrp->flags;
else
cgrp_kill_seq = kargs->cgrp->kill_seq;
} else {
cgrp_flags = cset->dfl_cgrp->flags;
cgrp_kill_seq = cset->dfl_cgrp->kill_seq;
}

WARN_ON_ONCE(!list_empty(&child->cg_list));
cset->nr_tasks++;
Expand Down Expand Up @@ -6719,7 +6723,7 @@ void cgroup_post_fork(struct task_struct *child,
* child down right after we finished preparing it for
* userspace.
*/
kill = test_bit(CGRP_KILL, &cgrp_flags);
kill = kargs->kill_seq != cgrp_kill_seq;
}

spin_unlock_irq(&css_set_lock);
Expand Down
1 change: 0 additions & 1 deletion kernel/cgroup/rstat.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,7 +590,6 @@ static void root_cgroup_cputime(struct cgroup_base_stat *bstat)

cputime->sum_exec_runtime += user;
cputime->sum_exec_runtime += sys;
cputime->sum_exec_runtime += cpustat[CPUTIME_STEAL];

#ifdef CONFIG_SCHED_CORE
bstat->forceidle_sum += cpustat[CPUTIME_FORCEIDLE];
Expand Down
2 changes: 1 addition & 1 deletion tools/testing/selftests/cgroup/test_cpuset_v1_hp.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test the special cpuset v1 hotplug case where a cpuset become empty of
Expand Down

0 comments on commit 80868f5

Please sign in to comment.