Skip to content

Commit ae591cf

Browse files
Chen Ridonggregkh
authored andcommitted
sched,freezer: Remove unnecessary warning in __thaw_task
commit 9beb8c5 upstream. Commit cff5f49 ("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 commit cff5f49 ("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 commit cff5f49 ("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 036bdae commit ae591cf

1 file changed

Lines changed: 3 additions & 12 deletions

File tree

kernel/freezer.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -196,18 +196,9 @@ static int __restore_freezer_state(struct task_struct *p, void *arg)
196196

197197
void __thaw_task(struct task_struct *p)
198198
{
199-
unsigned long flags;
200-
201-
spin_lock_irqsave(&freezer_lock, flags);
202-
if (WARN_ON_ONCE(freezing(p)))
203-
goto unlock;
204-
205-
if (!frozen(p) || task_call_func(p, __restore_freezer_state, NULL))
206-
goto unlock;
207-
208-
wake_up_state(p, TASK_FROZEN);
209-
unlock:
210-
spin_unlock_irqrestore(&freezer_lock, flags);
199+
guard(spinlock_irqsave)(&freezer_lock);
200+
if (frozen(p) && !task_call_func(p, __restore_freezer_state, NULL))
201+
wake_up_state(p, TASK_FROZEN);
211202
}
212203

213204
/**

0 commit comments

Comments
 (0)