65 lines
1.9 KiB
Diff
65 lines
1.9 KiB
Diff
From 6e492900893c011cbe13fbb881cf1e11df08982b Mon Sep 17 00:00:00 2001
|
|
From: Chen Ridong <chenridong@huawei.com>
|
|
Date: Wed, 18 Jun 2025 07:32:17 +0000
|
|
Subject: cgroup,freezer: fix incomplete freezing when attaching tasks
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
An issue was found:
|
|
|
|
# cd /sys/fs/cgroup/freezer/
|
|
# mkdir test
|
|
# echo FROZEN > test/freezer.state
|
|
# cat test/freezer.state
|
|
FROZEN
|
|
# sleep 1000 &
|
|
[1] 863
|
|
# echo 863 > test/cgroup.procs
|
|
# cat test/freezer.state
|
|
FREEZING
|
|
|
|
When tasks are migrated to a frozen cgroup, the freezer fails to
|
|
immediately freeze the tasks, causing the cgroup to remain in the
|
|
"FREEZING".
|
|
|
|
The freeze_task() function is called before clearing the CGROUP_FROZEN
|
|
flag. This causes the freezing() check to incorrectly return false,
|
|
preventing __freeze_task() from being invoked for the migrated task.
|
|
|
|
To fix this issue, clear the CGROUP_FROZEN state before calling
|
|
freeze_task().
|
|
|
|
Fixes: f5d39b020809 ("freezer,sched: Rewrite core freezer logic")
|
|
Cc: stable@vger.kernel.org # v6.1+
|
|
Reported-by: Zhong Jiawei <zhongjiawei1@huawei.com>
|
|
Signed-off-by: Chen Ridong <chenridong@huawei.com>
|
|
Acked-by: Michal Koutný <mkoutny@suse.com>
|
|
Signed-off-by: Tejun Heo <tj@kernel.org>
|
|
---
|
|
kernel/cgroup/legacy_freezer.c | 3 +--
|
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
|
|
|
diff --git a/kernel/cgroup/legacy_freezer.c b/kernel/cgroup/legacy_freezer.c
|
|
index 039d1eb2f215..507b8f19a262 100644
|
|
--- a/kernel/cgroup/legacy_freezer.c
|
|
+++ b/kernel/cgroup/legacy_freezer.c
|
|
@@ -188,13 +188,12 @@ static void freezer_attach(struct cgroup_taskset *tset)
|
|
if (!(freezer->state & CGROUP_FREEZING)) {
|
|
__thaw_task(task);
|
|
} else {
|
|
- freeze_task(task);
|
|
-
|
|
/* clear FROZEN and propagate upwards */
|
|
while (freezer && (freezer->state & CGROUP_FROZEN)) {
|
|
freezer->state &= ~CGROUP_FROZEN;
|
|
freezer = parent_freezer(freezer);
|
|
}
|
|
+ freeze_task(task);
|
|
}
|
|
}
|
|
|
|
--
|
|
2.50.0
|
|
|