]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - mm/khugepaged.c
mm/tlb, x86/mm: Support invalidating TLB caches for RCU_TABLE_FREE
[mirror_ubuntu-bionic-kernel.git] / mm / khugepaged.c
index ea4ff259b67195b32d3335795d4de80c4e6e5bcf..1668094711cb5ad6f84b08a6027f7c3ed4a6d9e6 100644 (file)
@@ -530,7 +530,12 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma,
                        goto out;
                }
 
-               VM_BUG_ON_PAGE(PageCompound(page), page);
+               /* TODO: teach khugepaged to collapse THP mapped with pte */
+               if (PageCompound(page)) {
+                       result = SCAN_PAGE_COMPOUND;
+                       goto out;
+               }
+
                VM_BUG_ON_PAGE(!PageAnon(page), page);
 
                /*
@@ -960,7 +965,9 @@ static void collapse_huge_page(struct mm_struct *mm,
                goto out_nolock;
        }
 
-       if (unlikely(mem_cgroup_try_charge(new_page, mm, gfp, &memcg, true))) {
+       /* Do not oom kill for khugepaged charges */
+       if (unlikely(mem_cgroup_try_charge(new_page, mm, gfp | __GFP_NORETRY,
+                                          &memcg, true))) {
                result = SCAN_CGROUP_CHARGE_FAIL;
                goto out_nolock;
        }
@@ -1319,7 +1326,9 @@ static void collapse_shmem(struct mm_struct *mm,
                goto out;
        }
 
-       if (unlikely(mem_cgroup_try_charge(new_page, mm, gfp, &memcg, true))) {
+       /* Do not oom kill for khugepaged charges */
+       if (unlikely(mem_cgroup_try_charge(new_page, mm, gfp | __GFP_NORETRY,
+                                          &memcg, true))) {
                result = SCAN_CGROUP_CHARGE_FAIL;
                goto out;
        }
@@ -1674,10 +1683,14 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages,
        spin_unlock(&khugepaged_mm_lock);
 
        mm = mm_slot->mm;
-       down_read(&mm->mmap_sem);
-       if (unlikely(khugepaged_test_exit(mm)))
-               vma = NULL;
-       else
+       /*
+        * Don't wait for semaphore (to avoid long wait times).  Just move to
+        * the next mm on the list.
+        */
+       vma = NULL;
+       if (unlikely(!down_read_trylock(&mm->mmap_sem)))
+               goto breakouterloop_mmap_sem;
+       if (likely(!khugepaged_test_exit(mm)))
                vma = find_vma(mm, khugepaged_scan.address);
 
        progress++;