aboutsummaryrefslogtreecommitdiffstats
path: root/mm/huge_memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r--mm/huge_memory.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 87ab9b8f56b5..5a68730eebd6 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -555,7 +555,8 @@ static int __do_huge_pmd_anonymous_page(struct vm_fault *vmf, struct page *page,
555 555
556 VM_BUG_ON_PAGE(!PageCompound(page), page); 556 VM_BUG_ON_PAGE(!PageCompound(page), page);
557 557
558 if (mem_cgroup_try_charge(page, vma->vm_mm, gfp, &memcg, true)) { 558 if (mem_cgroup_try_charge(page, vma->vm_mm, gfp | __GFP_NORETRY, &memcg,
559 true)) {
559 put_page(page); 560 put_page(page);
560 count_vm_event(THP_FAULT_FALLBACK); 561 count_vm_event(THP_FAULT_FALLBACK);
561 return VM_FAULT_FALLBACK; 562 return VM_FAULT_FALLBACK;
@@ -1316,7 +1317,7 @@ alloc:
1316 } 1317 }
1317 1318
1318 if (unlikely(mem_cgroup_try_charge(new_page, vma->vm_mm, 1319 if (unlikely(mem_cgroup_try_charge(new_page, vma->vm_mm,
1319 huge_gfp, &memcg, true))) { 1320 huge_gfp | __GFP_NORETRY, &memcg, true))) {
1320 put_page(new_page); 1321 put_page(new_page);
1321 split_huge_pmd(vma, vmf->pmd, vmf->address); 1322 split_huge_pmd(vma, vmf->pmd, vmf->address);
1322 if (page) 1323 if (page)
@@ -2783,11 +2784,13 @@ static unsigned long deferred_split_scan(struct shrinker *shrink,
2783 2784
2784 list_for_each_safe(pos, next, &list) { 2785 list_for_each_safe(pos, next, &list) {
2785 page = list_entry((void *)pos, struct page, mapping); 2786 page = list_entry((void *)pos, struct page, mapping);
2786 lock_page(page); 2787 if (!trylock_page(page))
2788 goto next;
2787 /* split_huge_page() removes page from list on success */ 2789 /* split_huge_page() removes page from list on success */
2788 if (!split_huge_page(page)) 2790 if (!split_huge_page(page))
2789 split++; 2791 split++;
2790 unlock_page(page); 2792 unlock_page(page);
2793next:
2791 put_page(page); 2794 put_page(page);
2792 } 2795 }
2793 2796