Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a5be2d0d authored by Tejun Heo's avatar Tejun Heo
Browse files

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: default avatarTejun Heo <tj@kernel.org>
Cc: Paul Menage <menage@google.com>
Cc: Matt Helsley <matthltc@us.ibm.com>
parent 8a32c441
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -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; }
+3 −4
Original line number Original line Diff line number Diff line
@@ -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;
+12 −19
Original line number Original line Diff line number Diff line
@@ -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);
	if (was_frozen)
		p->flags &= ~PF_FROZEN;
	else
		clear_freeze_flag(p);
	task_unlock(p);
	task_unlock(p);

	if (was_frozen)
		wake_up_process(p);
		wake_up_process(p);
		return 1;
	}
	task_unlock(p);
	return 0;
}
}
EXPORT_SYMBOL(thaw_process);
+1 −1
Original line number Original line Diff line number Diff line
@@ -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);
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -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)