freezer: rename thaw_process() to __thaw_task() and simplify the implementation
thaw_process() now has only internal users - system and cgroup freezers. Remove the unnecessary return value, rename, unexport and collapse __thaw_process() into it. This will help further updates to the freezer code. -v3: oom_kill grew a use of thaw_process() while this patch was pending. Convert it to use __thaw_task() for now. In the longer term, this should be handled by allowing tasks to die if killed even if it's frozen. -v2: minor style update as suggested by Matt. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Paul Menage <menage@google.com> Cc: Matt Helsley <matthltc@us.ibm.com>
This commit is contained in:
Родитель
8a32c441c1
Коммит
a5be2d0d1a
|
@ -45,7 +45,7 @@ static inline bool should_send_signal(struct task_struct *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Takes and releases task alloc lock using task_lock() */
|
/* Takes and releases task alloc lock using task_lock() */
|
||||||
extern int thaw_process(struct task_struct *p);
|
extern void __thaw_task(struct task_struct *t);
|
||||||
|
|
||||||
extern bool __refrigerator(bool check_kthr_stop);
|
extern bool __refrigerator(bool check_kthr_stop);
|
||||||
extern int freeze_processes(void);
|
extern int freeze_processes(void);
|
||||||
|
@ -178,7 +178,6 @@ static inline int frozen(struct task_struct *p) { return 0; }
|
||||||
static inline int freezing(struct task_struct *p) { return 0; }
|
static inline int freezing(struct task_struct *p) { return 0; }
|
||||||
static inline void set_freeze_flag(struct task_struct *p) {}
|
static inline void set_freeze_flag(struct task_struct *p) {}
|
||||||
static inline void clear_freeze_flag(struct task_struct *p) {}
|
static inline void clear_freeze_flag(struct task_struct *p) {}
|
||||||
static inline int thaw_process(struct task_struct *p) { return 1; }
|
|
||||||
|
|
||||||
static inline bool __refrigerator(bool check_kthr_stop) { return false; }
|
static inline bool __refrigerator(bool check_kthr_stop) { return false; }
|
||||||
static inline int freeze_processes(void) { return -ENOSYS; }
|
static inline int freeze_processes(void) { return -ENOSYS; }
|
||||||
|
|
|
@ -130,7 +130,7 @@ struct cgroup_subsys freezer_subsys;
|
||||||
* write_lock css_set_lock (cgroup iterator start)
|
* write_lock css_set_lock (cgroup iterator start)
|
||||||
* task->alloc_lock
|
* task->alloc_lock
|
||||||
* read_lock css_set_lock (cgroup iterator start)
|
* read_lock css_set_lock (cgroup iterator start)
|
||||||
* task->alloc_lock (inside thaw_process(), prevents race with refrigerator())
|
* task->alloc_lock (inside __thaw_task(), prevents race with refrigerator())
|
||||||
* sighand->siglock
|
* sighand->siglock
|
||||||
*/
|
*/
|
||||||
static struct cgroup_subsys_state *freezer_create(struct cgroup_subsys *ss,
|
static struct cgroup_subsys_state *freezer_create(struct cgroup_subsys *ss,
|
||||||
|
@ -300,9 +300,8 @@ static void unfreeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
|
||||||
struct task_struct *task;
|
struct task_struct *task;
|
||||||
|
|
||||||
cgroup_iter_start(cgroup, &it);
|
cgroup_iter_start(cgroup, &it);
|
||||||
while ((task = cgroup_iter_next(cgroup, &it))) {
|
while ((task = cgroup_iter_next(cgroup, &it)))
|
||||||
thaw_process(task);
|
__thaw_task(task);
|
||||||
}
|
|
||||||
cgroup_iter_end(cgroup, &it);
|
cgroup_iter_end(cgroup, &it);
|
||||||
|
|
||||||
freezer->state = CGROUP_THAWED;
|
freezer->state = CGROUP_THAWED;
|
||||||
|
|
|
@ -145,18 +145,8 @@ void cancel_freezing(struct task_struct *p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __thaw_process(struct task_struct *p)
|
|
||||||
{
|
|
||||||
if (frozen(p)) {
|
|
||||||
p->flags &= ~PF_FROZEN;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
clear_freeze_flag(p);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wake up a frozen process
|
* Wake up a frozen task
|
||||||
*
|
*
|
||||||
* task_lock() is needed to prevent the race with refrigerator() which may
|
* task_lock() is needed to prevent the race with refrigerator() which may
|
||||||
* occur if the freezing of tasks fails. Namely, without the lock, if the
|
* occur if the freezing of tasks fails. Namely, without the lock, if the
|
||||||
|
@ -164,15 +154,18 @@ static int __thaw_process(struct task_struct *p)
|
||||||
* refrigerator() could call frozen_process(), in which case the task would be
|
* refrigerator() could call frozen_process(), in which case the task would be
|
||||||
* frozen and no one would thaw it.
|
* frozen and no one would thaw it.
|
||||||
*/
|
*/
|
||||||
int thaw_process(struct task_struct *p)
|
void __thaw_task(struct task_struct *p)
|
||||||
{
|
{
|
||||||
|
bool was_frozen;
|
||||||
|
|
||||||
task_lock(p);
|
task_lock(p);
|
||||||
if (__thaw_process(p) == 1) {
|
was_frozen = frozen(p);
|
||||||
task_unlock(p);
|
if (was_frozen)
|
||||||
wake_up_process(p);
|
p->flags &= ~PF_FROZEN;
|
||||||
return 1;
|
else
|
||||||
}
|
clear_freeze_flag(p);
|
||||||
task_unlock(p);
|
task_unlock(p);
|
||||||
return 0;
|
|
||||||
|
if (was_frozen)
|
||||||
|
wake_up_process(p);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(thaw_process);
|
|
||||||
|
|
|
@ -186,7 +186,7 @@ static void thaw_tasks(bool nosig_only)
|
||||||
if (cgroup_freezing_or_frozen(p))
|
if (cgroup_freezing_or_frozen(p))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
thaw_process(p);
|
__thaw_task(p);
|
||||||
} while_each_thread(g, p);
|
} while_each_thread(g, p);
|
||||||
read_unlock(&tasklist_lock);
|
read_unlock(&tasklist_lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -328,7 +328,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints,
|
||||||
*/
|
*/
|
||||||
if (test_tsk_thread_flag(p, TIF_MEMDIE)) {
|
if (test_tsk_thread_flag(p, TIF_MEMDIE)) {
|
||||||
if (unlikely(frozen(p)))
|
if (unlikely(frozen(p)))
|
||||||
thaw_process(p);
|
__thaw_task(p);
|
||||||
return ERR_PTR(-1UL);
|
return ERR_PTR(-1UL);
|
||||||
}
|
}
|
||||||
if (!p->mm)
|
if (!p->mm)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче