Skip to content

Commit

Permalink
mm: memcontrol: remove explicit OOM parameter in charge path
Browse files Browse the repository at this point in the history
For the page allocator, __GFP_NORETRY implies that no OOM should be
triggered, whereas memcg has an explicit parameter to disable OOM.

The only callsites that want OOM disabled are THP charges and charge
moving.  THP already uses __GFP_NORETRY and charge moving can use it as
well - one full reclaim cycle should be plenty.  Switch it over, then
remove the OOM parameter.

Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Michal Hocko <mhocko@suse.cz>
Cc: Hugh Dickins <hughd@google.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Vladimir Davydov <vdavydov@parallels.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Michal Hocko authored and Linus Torvalds committed Aug 7, 2014
1 parent 9b13061 commit 0029e19
Showing 1 changed file with 10 additions and 22 deletions.
32 changes: 10 additions & 22 deletions mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2555,15 +2555,13 @@ static int memcg_cpu_hotplug_callback(struct notifier_block *nb,
* mem_cgroup_try_charge - try charging a memcg
* @memcg: memcg to charge
* @nr_pages: number of pages to charge
* @oom: trigger OOM if reclaim fails
*
* Returns 0 if @memcg was charged successfully, -EINTR if the charge
* was bypassed to root_mem_cgroup, and -ENOMEM if the charge failed.
*/
static int mem_cgroup_try_charge(struct mem_cgroup *memcg,
gfp_t gfp_mask,
unsigned int nr_pages,
bool oom)
unsigned int nr_pages)
{
unsigned int batch = max(CHARGE_BATCH, nr_pages);
int nr_retries = MEM_CGROUP_RECLAIM_RETRIES;
Expand Down Expand Up @@ -2647,9 +2645,6 @@ static int mem_cgroup_try_charge(struct mem_cgroup *memcg,
if (fatal_signal_pending(current))
goto bypass;

if (!oom)
goto nomem;

mem_cgroup_oom(mem_over_limit, gfp_mask, get_order(batch));
nomem:
if (!(gfp_mask & __GFP_NOFAIL))
Expand All @@ -2675,15 +2670,14 @@ static int mem_cgroup_try_charge(struct mem_cgroup *memcg,
*/
static struct mem_cgroup *mem_cgroup_try_charge_mm(struct mm_struct *mm,
gfp_t gfp_mask,
unsigned int nr_pages,
bool oom)
unsigned int nr_pages)

{
struct mem_cgroup *memcg;
int ret;

memcg = get_mem_cgroup_from_mm(mm);
ret = mem_cgroup_try_charge(memcg, gfp_mask, nr_pages, oom);
ret = mem_cgroup_try_charge(memcg, gfp_mask, nr_pages);
css_put(&memcg->css);
if (ret == -EINTR)
memcg = root_mem_cgroup;
Expand Down Expand Up @@ -2900,8 +2894,7 @@ static int memcg_charge_kmem(struct mem_cgroup *memcg, gfp_t gfp, u64 size)
if (ret)
return ret;

ret = mem_cgroup_try_charge(memcg, gfp, size >> PAGE_SHIFT,
oom_gfp_allowed(gfp));
ret = mem_cgroup_try_charge(memcg, gfp, size >> PAGE_SHIFT);
if (ret == -EINTR) {
/*
* mem_cgroup_try_charge() chosed to bypass to root due to
Expand Down Expand Up @@ -3650,7 +3643,6 @@ int mem_cgroup_charge_anon(struct page *page,
{
unsigned int nr_pages = 1;
struct mem_cgroup *memcg;
bool oom = true;

if (mem_cgroup_disabled())
return 0;
Expand All @@ -3662,14 +3654,9 @@ int mem_cgroup_charge_anon(struct page *page,
if (PageTransHuge(page)) {
nr_pages <<= compound_order(page);
VM_BUG_ON_PAGE(!PageTransHuge(page), page);
/*
* Never OOM-kill a process for a huge page. The
* fault handler will fall back to regular pages.
*/
oom = false;
}

memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, nr_pages, oom);
memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, nr_pages);
if (!memcg)
return -ENOMEM;
__mem_cgroup_commit_charge(memcg, page, nr_pages,
Expand Down Expand Up @@ -3706,7 +3693,7 @@ static int __mem_cgroup_try_charge_swapin(struct mm_struct *mm,
memcg = try_get_mem_cgroup_from_page(page);
if (!memcg)
memcg = get_mem_cgroup_from_mm(mm);
ret = mem_cgroup_try_charge(memcg, mask, 1, true);
ret = mem_cgroup_try_charge(memcg, mask, 1);
css_put(&memcg->css);
if (ret == -EINTR)
memcg = root_mem_cgroup;
Expand All @@ -3733,7 +3720,7 @@ int mem_cgroup_try_charge_swapin(struct mm_struct *mm, struct page *page,
if (!PageSwapCache(page)) {
struct mem_cgroup *memcg;

memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, 1, true);
memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, 1);
if (!memcg)
return -ENOMEM;
*memcgp = memcg;
Expand Down Expand Up @@ -3802,7 +3789,7 @@ int mem_cgroup_charge_file(struct page *page, struct mm_struct *mm,
return 0;
}

memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, 1, true);
memcg = mem_cgroup_try_charge_mm(mm, gfp_mask, 1);
if (!memcg)
return -ENOMEM;
__mem_cgroup_commit_charge(memcg, page, 1, type, false);
Expand Down Expand Up @@ -6440,7 +6427,8 @@ static int mem_cgroup_do_precharge(unsigned long count)
batch_count = PRECHARGE_COUNT_AT_ONCE;
cond_resched();
}
ret = mem_cgroup_try_charge(memcg, GFP_KERNEL, 1, false);
ret = mem_cgroup_try_charge(memcg,
GFP_KERNEL & ~__GFP_NORETRY, 1);
if (ret)
/* mem_cgroup_clear_mc() will do uncharge later */
return ret;
Expand Down

0 comments on commit 0029e19

Please sign in to comment.