mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
Revert "cgroup_freezer: cgroup_freezing: Check if not frozen"
[ Upstream commit14a67b42cb
] This reverts commitcff5f49d43
. Commitcff5f49d43
("cgroup_freezer: cgroup_freezing: Check if not frozen") modified the cgroup_freezing() logic to verify that the FROZEN flag is not set, affecting the return value of the freezing() function, in order to address a warning in __thaw_task. A race condition exists that may allow tasks to escape being frozen. The following scenario demonstrates this issue: CPU 0 (get_signal path) CPU 1 (freezer.state reader) try_to_freeze read freezer.state __refrigerator freezer_read update_if_frozen WRITE_ONCE(current->__state, TASK_FROZEN); ... /* Task is now marked frozen */ /* frozen(task) == true */ /* Assuming other tasks are frozen */ freezer->state |= CGROUP_FROZEN; /* freezing(current) returns false */ /* because cgroup is frozen (not freezing) */ break out __set_current_state(TASK_RUNNING); /* Bug: Task resumes running when it should remain frozen */ The existing !frozen(p) check in __thaw_task makes the WARN_ON_ONCE(freezing(p)) warning redundant. Removing this warning enables reverting the commitcff5f49d43
("cgroup_freezer: cgroup_freezing: Check if not frozen") to resolve the issue. The warning has been removed in the previous patch. This patch revert the commitcff5f49d43
("cgroup_freezer: cgroup_freezing: Check if not frozen") to complete the fix. Fixes:cff5f49d43
("cgroup_freezer: cgroup_freezing: Check if not frozen") Reported-by: Zhong Jiawei<zhongjiawei1@huawei.com> Signed-off-by: Chen Ridong <chenridong@huawei.com> Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
74bb4de32d
commit
f371ad6471
|
@ -66,15 +66,9 @@ static struct freezer *parent_freezer(struct freezer *freezer)
|
|||
bool cgroup_freezing(struct task_struct *task)
|
||||
{
|
||||
bool ret;
|
||||
unsigned int state;
|
||||
|
||||
rcu_read_lock();
|
||||
/* Check if the cgroup is still FREEZING, but not FROZEN. The extra
|
||||
* !FROZEN check is required, because the FREEZING bit is not cleared
|
||||
* when the state FROZEN is reached.
|
||||
*/
|
||||
state = task_freezer(task)->state;
|
||||
ret = (state & CGROUP_FREEZING) && !(state & CGROUP_FROZEN);
|
||||
ret = task_freezer(task)->state & CGROUP_FREEZING;
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue
Block a user