提交 467de1fc 编写于 作者: S Srivatsa S. Bhat 提交者: Rafael J. Wysocki

PM / Freezer: Remove the "userspace only" constraint from freezer[_do_not]_count()

At present, the functions freezer_count() and freezer_do_not_count()
impose the restriction that they are effective only for userspace processes.
However, now, these functions have found more utility than originally
intended by the commit which introduced it: ba96a0c8 (freezer:
fix vfork problem). And moreover, even the vfork issue actually does not
need the above restriction in these functions.

So, modify these functions to make them work even for kernel threads, so
that they can be used at other places in the kernel, where the userspace
restriction doesn't apply.
Suggested-by: NOleg Nesterov <oleg@redhat.com>
Suggested-by: NTejun Heo <tj@kernel.org>
Acked-by: NTejun Heo <tj@kernel.org>
Reviewed-by: NOleg Nesterov <oleg@redhat.com>
Signed-off-by: NSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
上级 d310310c
...@@ -67,33 +67,27 @@ static inline bool cgroup_freezing(struct task_struct *task) ...@@ -67,33 +67,27 @@ static inline bool cgroup_freezing(struct task_struct *task)
* appropriately in case the child has exited before the freezing of tasks is * appropriately in case the child has exited before the freezing of tasks is
* complete. However, we don't want kernel threads to be frozen in unexpected * complete. However, we don't want kernel threads to be frozen in unexpected
* places, so we allow them to block freeze_processes() instead or to set * places, so we allow them to block freeze_processes() instead or to set
* PF_NOFREEZE if needed and PF_FREEZER_SKIP is only set for userland vfork * PF_NOFREEZE if needed. Fortunately, in the ____call_usermodehelper() case the
* parents. Fortunately, in the ____call_usermodehelper() case the parent won't * parent won't really block freeze_processes(), since ____call_usermodehelper()
* really block freeze_processes(), since ____call_usermodehelper() (the child) * (the child) does a little before exec/exit and it can't be frozen before
* does a little before exec/exit and it can't be frozen before waking up the * waking up the parent.
* parent.
*/ */
/*
* If the current task is a user space one, tell the freezer not to count it as /* Tell the freezer not to count the current task as freezable. */
* freezable.
*/
static inline void freezer_do_not_count(void) static inline void freezer_do_not_count(void)
{ {
if (current->mm)
current->flags |= PF_FREEZER_SKIP; current->flags |= PF_FREEZER_SKIP;
} }
/* /*
* If the current task is a user space one, tell the freezer to count it as * Tell the freezer to count the current task as freezable again and try to
* freezable again and try to freeze it. * freeze it.
*/ */
static inline void freezer_count(void) static inline void freezer_count(void)
{ {
if (current->mm) {
current->flags &= ~PF_FREEZER_SKIP; current->flags &= ~PF_FREEZER_SKIP;
try_to_freeze(); try_to_freeze();
}
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册