|
@@ -556,8 +556,27 @@ static void oom_reap_task(struct task_struct *tsk)
|
|
|
schedule_timeout_idle(HZ/10);
|
|
|
|
|
|
if (attempts > MAX_OOM_REAP_RETRIES) {
|
|
|
+ struct task_struct *p;
|
|
|
+
|
|
|
pr_info("oom_reaper: unable to reap pid:%d (%s)\n",
|
|
|
task_pid_nr(tsk), tsk->comm);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If we've already tried to reap this task in the past and
|
|
|
+ * failed it probably doesn't make much sense to try yet again
|
|
|
+ * so hide the mm from the oom killer so that it can move on
|
|
|
+ * to another task with a different mm struct.
|
|
|
+ */
|
|
|
+ p = find_lock_task_mm(tsk);
|
|
|
+ if (p) {
|
|
|
+ if (test_and_set_bit(MMF_OOM_NOT_REAPABLE, &p->mm->flags)) {
|
|
|
+ pr_info("oom_reaper: giving up pid:%d (%s)\n",
|
|
|
+ task_pid_nr(tsk), tsk->comm);
|
|
|
+ set_bit(MMF_OOM_REAPED, &p->mm->flags);
|
|
|
+ }
|
|
|
+ task_unlock(p);
|
|
|
+ }
|
|
|
+
|
|
|
debug_show_all_locks();
|
|
|
}
|
|
|
|