|
@@ -110,13 +110,24 @@ extern struct task_struct *find_lock_task_mm(struct task_struct *p);
|
|
|
|
|
|
static inline bool task_will_free_mem(struct task_struct *task)
|
|
|
{
|
|
|
+ struct signal_struct *sig = task->signal;
|
|
|
+
|
|
|
/*
|
|
|
* A coredumping process may sleep for an extended period in exit_mm(),
|
|
|
* so the oom killer cannot assume that the process will promptly exit
|
|
|
* and release memory.
|
|
|
*/
|
|
|
- return (task->flags & PF_EXITING) &&
|
|
|
- !(task->signal->flags & SIGNAL_GROUP_COREDUMP);
|
|
|
+ if (sig->flags & SIGNAL_GROUP_COREDUMP)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (!(task->flags & PF_EXITING))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* Make sure that the whole thread group is going down */
|
|
|
+ if (!thread_group_empty(task) && !(sig->flags & SIGNAL_GROUP_EXIT))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
/* sysctls */
|