cgroup: Fixes for v6.14-rc2
- 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. -----BEGIN PGP SIGNATURE----- iIQEABYKACwWIQTfIjM1kS57o3GsC/uxYfJx3gVYGQUCZ6928A4cdGpAa2VybmVs Lm9yZwAKCRCxYfJx3gVYGYrbAPsEtoH5GFw7VtKIy4fS23QbtxUuwW0fERrPWGyt JtQv3gD5AboBUrGWdgiM5c2bIXT3f+Bn9w3HhLiPaB8ieN/0kA8= =3BBH -----END PGP SIGNATURE----- Merge tag 'cgroup-for-6.14-rc2-fixes' of git://git.kernel.org/pub/scm/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
This commit is contained in:
commit
80868f5d3d
5 changed files with 17 additions and 13 deletions
|
@ -71,9 +71,6 @@ enum {
|
|||
|
||||
/* Cgroup is frozen. */
|
||||
CGRP_FROZEN,
|
||||
|
||||
/* Control group has to be killed. */
|
||||
CGRP_KILL,
|
||||
};
|
||||
|
||||
/* cgroup_root->flags */
|
||||
|
@ -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" */
|
||||
|
|
|
@ -43,6 +43,7 @@ struct kernel_clone_args {
|
|||
void *fn_arg;
|
||||
struct cgroup *cgrp;
|
||||
struct css_set *cset;
|
||||
unsigned int kill_seq;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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)) {
|
||||
|
@ -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;
|
||||
|
@ -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++;
|
||||
|
@ -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);
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue