freezer: test freezable conditions while holding freezer_lock
try_to_freeze_tasks() and thaw_processes() use freezable() and frozen() as preliminary tests before initiating operations on a task. These are done without any synchronization and hinder with synchronization cleanup without any real performance benefits. In try_to_freeze_tasks(), open code self test and move PF_NOFREEZE and frozen() tests inside freezer_lock in freeze_task(). thaw_processes() can simply drop freezable() test as frozen() test in __thaw_task() is enough. Note: This used to be a part of larger patch to fix set_freezable() race. Separated out to satisfy ordering among dependent fixes. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Oleg Nesterov <oleg@redhat.com>
This commit is contained in:
parent
6907483b4e
commit
85f1d47665
@ -109,7 +109,8 @@ bool freeze_task(struct task_struct *p, bool sig_only)
|
|||||||
|
|
||||||
spin_lock_irqsave(&freezer_lock, flags);
|
spin_lock_irqsave(&freezer_lock, flags);
|
||||||
|
|
||||||
if (sig_only && !should_send_signal(p))
|
if ((p->flags & PF_NOFREEZE) ||
|
||||||
|
(sig_only && !should_send_signal(p)))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
if (frozen(p))
|
if (frozen(p))
|
||||||
|
@ -22,14 +22,6 @@
|
|||||||
*/
|
*/
|
||||||
#define TIMEOUT (20 * HZ)
|
#define TIMEOUT (20 * HZ)
|
||||||
|
|
||||||
static inline int freezable(struct task_struct * p)
|
|
||||||
{
|
|
||||||
if ((p == current) ||
|
|
||||||
(p->flags & PF_NOFREEZE))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int try_to_freeze_tasks(bool sig_only)
|
static int try_to_freeze_tasks(bool sig_only)
|
||||||
{
|
{
|
||||||
struct task_struct *g, *p;
|
struct task_struct *g, *p;
|
||||||
@ -52,10 +44,7 @@ static int try_to_freeze_tasks(bool sig_only)
|
|||||||
todo = 0;
|
todo = 0;
|
||||||
read_lock(&tasklist_lock);
|
read_lock(&tasklist_lock);
|
||||||
do_each_thread(g, p) {
|
do_each_thread(g, p) {
|
||||||
if (frozen(p) || !freezable(p))
|
if (p == current || !freeze_task(p, sig_only))
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!freeze_task(p, sig_only))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -181,9 +170,6 @@ void thaw_processes(void)
|
|||||||
|
|
||||||
read_lock(&tasklist_lock);
|
read_lock(&tasklist_lock);
|
||||||
do_each_thread(g, p) {
|
do_each_thread(g, p) {
|
||||||
if (!freezable(p))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (cgroup_freezing_or_frozen(p))
|
if (cgroup_freezing_or_frozen(p))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user