mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
sched,freezer: Remove unnecessary warning in __thaw_task
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 commitcff5f49d43
("cgroup_freezer: cgroup_freezing: Check if not frozen") to resolve the issue. This patch removes the warning from __thaw_task. A subsequent patch will revert commitcff5f49d43
("cgroup_freezer: cgroup_freezing: Check if not frozen") to complete the fix. Reported-by: Zhong Jiawei<zhongjiawei1@huawei.com> Signed-off-by: Chen Ridong <chenridong@huawei.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
37fb58a727
commit
9beb8c5e77
@ -201,18 +201,9 @@ static int __restore_freezer_state(struct task_struct *p, void *arg)
|
|||||||
|
|
||||||
void __thaw_task(struct task_struct *p)
|
void __thaw_task(struct task_struct *p)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
guard(spinlock_irqsave)(&freezer_lock);
|
||||||
|
if (frozen(p) && !task_call_func(p, __restore_freezer_state, NULL))
|
||||||
spin_lock_irqsave(&freezer_lock, flags);
|
wake_up_state(p, TASK_FROZEN);
|
||||||
if (WARN_ON_ONCE(freezing(p)))
|
|
||||||
goto unlock;
|
|
||||||
|
|
||||||
if (!frozen(p) || task_call_func(p, __restore_freezer_state, NULL))
|
|
||||||
goto unlock;
|
|
||||||
|
|
||||||
wake_up_state(p, TASK_FROZEN);
|
|
||||||
unlock:
|
|
||||||
spin_unlock_irqrestore(&freezer_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user