diff options
-rw-r--r-- | mm/memcontrol.c | 32 |
1 files changed, 10 insertions, 22 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 3069d6420b0e..8aaca8267dfe 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -2555,15 +2555,13 @@ static int memcg_cpu_hotplug_callback(struct notifier_block *nb, | |||
2555 | * mem_cgroup_try_charge - try charging a memcg | 2555 | * mem_cgroup_try_charge - try charging a memcg |
2556 | * @memcg: memcg to charge | 2556 | * @memcg: memcg to charge |
2557 | * @nr_pages: number of pages to charge | 2557 | * @nr_pages: number of pages to charge |
2558 | * @oom: trigger OOM if reclaim fails | ||
2559 | * | 2558 | * |
2560 | * Returns 0 if @memcg was charged successfully, -EINTR if the charge | 2559 | * Returns 0 if @memcg was charged successfully, -EINTR if the charge |
2561 | * was bypassed to root_mem_cgroup, and -ENOMEM if the charge failed. | 2560 | * was bypassed to root_mem_cgroup, and -ENOMEM if the charge failed. |
2562 | */ | 2561 | */ |
2563 | static int mem_cgroup_try_charge(struct mem_cgroup *memcg, | 2562 | static int mem_cgroup_try_charge(struct mem_cgroup *memcg, |
2564 | gfp_t gfp_mask, | 2563 | gfp_t gfp_mask, |
2565 | unsigned int nr_pages, | 2564 | unsigned int nr_pages) |
2566 | bool oom) | ||
2567 | { | 2565 | { |
2568 | unsigned int batch = max(CHARGE_BATCH, nr_pages); | 2566 | unsigned int batch = max(CHARGE_BATCH, nr_pages); |
2569 | int nr_retries = MEM_CGROUP_RECLAIM_RETRIES; | 2567 | int nr_retries = MEM_CGROUP_RECLAIM_RETRIES; |
@@ -2647,9 +2645,6 @@ retry: | |||
2647 | if (fatal_signal_pending(current)) | 2645 | if (fatal_signal_pending(current)) |
2648 | goto bypass; | 2646 | goto bypass; |
2649 | 2647 | ||
2650 | if (!oom) | ||
2651 | goto nomem; | ||
2652 | |||
2653 | mem_cgroup_oom(mem_over_limit, gfp_mask, get_order(batch)); | 2648 | mem_cgroup_oom(mem_over_limit, gfp_mask, get_order(batch)); |
2654 | nomem: | 2649 | nomem: |
2655 | if (!(gfp_mask & __GFP_NOFAIL)) | 2650 | if (!(gfp_mask & __GFP_NOFAIL)) |
@@ -2675,15 +2670,14 @@ done: | |||
2675 | */ | 2670 | */ |
2676 | static struct mem_cgroup *mem_cgroup_try_charge_mm(struct mm_struct *mm, | 2671 | static struct mem_cgroup *mem_cgroup_try_charge_mm(struct mm_struct *mm, |
2677 | gfp_t gfp_mask, | 2672 | gfp_t gfp_mask, |
2678 | unsigned int nr_pages, | 2673 | unsigned int nr_pages) |
2679 | bool oom) | ||
2680 | 2674 | ||
2681 | { | 2675 | { |
2682 | struct mem_cgroup *memcg; | 2676 | struct mem_cgroup *memcg; |
2683 | int ret; | 2677 | int ret; |
2684 | 2678 | ||
2685 | memcg = get_mem_cgroup_from_mm(mm); | 2679 | memcg = get_mem_cgroup_from_mm(mm); |
2686 | ret = mem_cgroup_try_charge(memcg, gfp_mask, nr_pages, oom); | 2680 | ret = mem_cgroup_try_charge(memcg, gfp_mask, nr_pages); |
2687 | css_put(&memcg->css); | 2681 | css_put(&memcg->css); |
2688 | if (ret == -EINTR) | 2682 | if (ret == -EINTR) |
2689 | memcg = root_mem_cgroup; | 2683 | memcg = root_mem_cgroup; |
@@ -2900,8 +2894,7 @@ static int memcg_charge_kmem(struct mem_cgroup *memcg, gfp_t gfp, u64 size) | |||
2900 | if (ret) | 2894 | if (ret) |
2901 | return ret; | 2895 | return ret; |
2902 | 2896 | ||
2903 | ret = mem_cgroup_try_charge(memcg, gfp, size >> PAGE_SHIFT, | 2897 | ret = mem_cgroup_try_charge(memcg, gfp, size >> PAGE_SHIFT); |
2904 | oom_gfp_allowed(gfp)); | ||
2905 | if (ret == -EINTR) { | 2898 | if (ret == -EINTR) { |
2906 | /* | 2899 | /* |
2907 | * mem_cgroup_try_charge() chosed to bypass to root due to | 2900 | * mem_cgroup_try_charge() chosed to bypass to root due to |
@@ -3650,7 +3643,6 @@ int mem_cgroup_charge_anon(struct page *page, | |||
3650 | { | 3643 | { |
3651 | unsigned int nr_pages = 1; | 3644 | unsigned int nr_pages = 1; |
3652 | struct mem_cgroup *memcg; | 3645 | struct mem_cgroup *memcg; |
3653 | bool oom = true; | ||
3654 | 3646 | ||
3655 | if (mem_cgroup_disabled()) | 3647 | if (mem_cgroup_disabled()) |
3656 | return 0; | 3648 | return 0; |
@@ -3662,14 +3654,9 @@ int mem_cgroup_charge_anon(struct page *page, | |||
3662 | if (PageTransHuge(page)) { | 3654 | if (PageTransHuge(page)) { |
3663 | nr_pages <<= compound_order(page); | 3655 | nr_pages <<= compound_order(page); |
3664 | VM_BUG_ON_PAGE(!PageTransHuge(page), page); | 3656 | VM_BUG_ON_PAGE(!PageTransHuge(page), page); |
3665 | /* | ||
3666 | * Never OOM-kill a process for a huge page. The | ||
3667 | * fault handler will fall back to regular pages. | ||
3668 | */ | ||
3669 | oom = false; | ||
3670 | } | 3657 | } |
3671 | 3658 | ||
3672 | memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, nr_pages, oom); | 3659 | memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, nr_pages); |
3673 | if (!memcg) | 3660 | if (!memcg) |
3674 | return -ENOMEM; | 3661 | return -ENOMEM; |
3675 | __mem_cgroup_commit_charge(memcg, page, nr_pages, | 3662 | __mem_cgroup_commit_charge(memcg, page, nr_pages, |
@@ -3706,7 +3693,7 @@ static int __mem_cgroup_try_charge_swapin(struct mm_struct *mm, | |||
3706 | memcg = try_get_mem_cgroup_from_page(page); | 3693 | memcg = try_get_mem_cgroup_from_page(page); |
3707 | if (!memcg) | 3694 | if (!memcg) |
3708 | memcg = get_mem_cgroup_from_mm(mm); | 3695 | memcg = get_mem_cgroup_from_mm(mm); |
3709 | ret = mem_cgroup_try_charge(memcg, mask, 1, true); | 3696 | ret = mem_cgroup_try_charge(memcg, mask, 1); |
3710 | css_put(&memcg->css); | 3697 | css_put(&memcg->css); |
3711 | if (ret == -EINTR) | 3698 | if (ret == -EINTR) |
3712 | memcg = root_mem_cgroup; | 3699 | memcg = root_mem_cgroup; |
@@ -3733,7 +3720,7 @@ int mem_cgroup_try_charge_swapin(struct mm_struct *mm, struct page *page, | |||
3733 | if (!PageSwapCache(page)) { | 3720 | if (!PageSwapCache(page)) { |
3734 | struct mem_cgroup *memcg; | 3721 | struct mem_cgroup *memcg; |
3735 | 3722 | ||
3736 | memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, 1, true); | 3723 | memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, 1); |
3737 | if (!memcg) | 3724 | if (!memcg) |
3738 | return -ENOMEM; | 3725 | return -ENOMEM; |
3739 | *memcgp = memcg; | 3726 | *memcgp = memcg; |
@@ -3802,7 +3789,7 @@ int mem_cgroup_charge_file(struct page *page, struct mm_struct *mm, | |||
3802 | return 0; | 3789 | return 0; |
3803 | } | 3790 | } |
3804 | 3791 | ||
3805 | memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, 1, true); | 3792 | memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, 1); |
3806 | if (!memcg) | 3793 | if (!memcg) |
3807 | return -ENOMEM; | 3794 | return -ENOMEM; |
3808 | __mem_cgroup_commit_charge(memcg, page, 1, type, false); | 3795 | __mem_cgroup_commit_charge(memcg, page, 1, type, false); |
@@ -6440,7 +6427,8 @@ one_by_one: | |||
6440 | batch_count = PRECHARGE_COUNT_AT_ONCE; | 6427 | batch_count = PRECHARGE_COUNT_AT_ONCE; |
6441 | cond_resched(); | 6428 | cond_resched(); |
6442 | } | 6429 | } |
6443 | ret = mem_cgroup_try_charge(memcg, GFP_KERNEL, 1, false); | 6430 | ret = mem_cgroup_try_charge(memcg, |
6431 | GFP_KERNEL & ~__GFP_NORETRY, 1); | ||
6444 | if (ret) | 6432 | if (ret) |
6445 | /* mem_cgroup_clear_mc() will do uncharge later */ | 6433 | /* mem_cgroup_clear_mc() will do uncharge later */ |
6446 | return ret; | 6434 | return ret; |