]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - mm/oom_kill.c
sched/headers: Prepare for new header dependencies before moving code to <linux/sched...
[mirror_ubuntu-artful-kernel.git] / mm / oom_kill.c
index ec9f11d4f094467e98b8190b7195379174d6be0a..69f75b0146076e69689b4505d82a8cf95789a28d 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/err.h>
 #include <linux/gfp.h>
 #include <linux/sched.h>
+#include <linux/sched/mm.h>
+#include <linux/sched/coredump.h>
 #include <linux/swap.h>
 #include <linux/timex.h>
 #include <linux/jiffies.h>
@@ -403,12 +405,14 @@ static void dump_tasks(struct mem_cgroup *memcg, const nodemask_t *nodemask)
 
 static void dump_header(struct oom_control *oc, struct task_struct *p)
 {
-       nodemask_t *nm = (oc->nodemask) ? oc->nodemask : &cpuset_current_mems_allowed;
-
-       pr_warn("%s invoked oom-killer: gfp_mask=%#x(%pGg), nodemask=%*pbl, order=%d, oom_score_adj=%hd\n",
-               current->comm, oc->gfp_mask, &oc->gfp_mask,
-               nodemask_pr_args(nm), oc->order,
-               current->signal->oom_score_adj);
+       pr_warn("%s invoked oom-killer: gfp_mask=%#x(%pGg), nodemask=",
+               current->comm, oc->gfp_mask, &oc->gfp_mask);
+       if (oc->nodemask)
+               pr_cont("%*pbl", nodemask_pr_args(oc->nodemask));
+       else
+               pr_cont("(null)");
+       pr_cont(",  order=%d, oom_score_adj=%hd\n",
+               oc->order, current->signal->oom_score_adj);
        if (!IS_ENABLED(CONFIG_COMPACTION) && oc->order)
                pr_warn("COMPACTION is disabled!!!\n");
 
@@ -417,7 +421,7 @@ static void dump_header(struct oom_control *oc, struct task_struct *p)
        if (oc->memcg)
                mem_cgroup_print_oom_info(oc->memcg, p);
        else
-               show_mem(SHOW_MEM_FILTER_NODES);
+               show_mem(SHOW_MEM_FILTER_NODES, oc->nodemask);
        if (sysctl_oom_dump_tasks)
                dump_tasks(oc->memcg, oc->nodemask);
 }
@@ -465,8 +469,6 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm)
 {
        struct mmu_gather tlb;
        struct vm_area_struct *vma;
-       struct zap_details details = {.check_swap_entries = true,
-                                     .ignore_dirty = true};
        bool ret = true;
 
        /*
@@ -510,14 +512,7 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm)
 
        tlb_gather_mmu(&tlb, mm, 0, -1);
        for (vma = mm->mmap ; vma; vma = vma->vm_next) {
-               if (is_vm_hugetlb_page(vma))
-                       continue;
-
-               /*
-                * mlocked VMAs require explicit munlocking before unmap.
-                * Let's keep it simple here and skip such VMAs.
-                */
-               if (vma->vm_flags & VM_LOCKED)
+               if (!can_madv_dontneed_vma(vma))
                        continue;
 
                /*
@@ -532,7 +527,7 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm)
                 */
                if (vma_is_anonymous(vma) || !(vma->vm_flags & VM_SHARED))
                        unmap_page_range(&tlb, vma, vma->vm_start, vma->vm_end,
-                                        &details);
+                                        NULL);
        }
        tlb_finish_mmu(&tlb, 0, -1);
        pr_info("oom_reaper: reaped process %d (%s), now anon-rss:%lukB, file-rss:%lukB, shmem-rss:%lukB\n",
@@ -660,7 +655,7 @@ static void mark_oom_victim(struct task_struct *tsk)
 
        /* oom_mm is bound to the signal struct life time. */
        if (!cmpxchg(&tsk->signal->oom_mm, NULL, mm))
-               atomic_inc(&tsk->signal->oom_mm->mm_count);
+               mmgrab(tsk->signal->oom_mm);
 
        /*
         * Make sure that the task is woken up from uninterruptible sleep
@@ -877,7 +872,7 @@ static void oom_kill_process(struct oom_control *oc, const char *message)
 
        /* Get a reference to safely compare mm after task_unlock(victim) */
        mm = victim->mm;
-       atomic_inc(&mm->mm_count);
+       mmgrab(mm);
        /*
         * We should send SIGKILL before setting TIF_MEMDIE in order to prevent
         * the OOM victim from depleting the memory reserves from the user
@@ -1013,7 +1008,7 @@ bool out_of_memory(struct oom_control *oc)
         * make sure exclude 0 mask - all other users should have at least
         * ___GFP_DIRECT_RECLAIM to get here.
         */
-       if (oc->gfp_mask && !(oc->gfp_mask & (__GFP_FS|__GFP_NOFAIL)))
+       if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS))
                return true;
 
        /*