提交 0029e19e 编写于 作者: M Michal Hocko 提交者: Linus Torvalds

mm: memcontrol: remove explicit OOM parameter in charge path

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: NJohannes Weiner <hannes@cmpxchg.org>
Signed-off-by: NMichal 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: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 9b130619
...@@ -2555,15 +2555,13 @@ static int memcg_cpu_hotplug_callback(struct notifier_block *nb, ...@@ -2555,15 +2555,13 @@ static int memcg_cpu_hotplug_callback(struct notifier_block *nb,
* mem_cgroup_try_charge - try charging a memcg * mem_cgroup_try_charge - try charging a memcg
* @memcg: memcg to charge * @memcg: memcg to charge
* @nr_pages: number of pages 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 * Returns 0 if @memcg was charged successfully, -EINTR if the charge
* was bypassed to root_mem_cgroup, and -ENOMEM if the charge failed. * was bypassed to root_mem_cgroup, and -ENOMEM if the charge failed.
*/ */
static int mem_cgroup_try_charge(struct mem_cgroup *memcg, static int mem_cgroup_try_charge(struct mem_cgroup *memcg,
gfp_t gfp_mask, gfp_t gfp_mask,
unsigned int nr_pages, unsigned int nr_pages)
bool oom)
{ {
unsigned int batch = max(CHARGE_BATCH, nr_pages); unsigned int batch = max(CHARGE_BATCH, nr_pages);
int nr_retries = MEM_CGROUP_RECLAIM_RETRIES; int nr_retries = MEM_CGROUP_RECLAIM_RETRIES;
...@@ -2647,9 +2645,6 @@ static int mem_cgroup_try_charge(struct mem_cgroup *memcg, ...@@ -2647,9 +2645,6 @@ static int mem_cgroup_try_charge(struct mem_cgroup *memcg,
if (fatal_signal_pending(current)) if (fatal_signal_pending(current))
goto bypass; goto bypass;
if (!oom)
goto nomem;
mem_cgroup_oom(mem_over_limit, gfp_mask, get_order(batch)); mem_cgroup_oom(mem_over_limit, gfp_mask, get_order(batch));
nomem: nomem:
if (!(gfp_mask & __GFP_NOFAIL)) if (!(gfp_mask & __GFP_NOFAIL))
...@@ -2675,15 +2670,14 @@ static int mem_cgroup_try_charge(struct mem_cgroup *memcg, ...@@ -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, static struct mem_cgroup *mem_cgroup_try_charge_mm(struct mm_struct *mm,
gfp_t gfp_mask, gfp_t gfp_mask,
unsigned int nr_pages, unsigned int nr_pages)
bool oom)
{ {
struct mem_cgroup *memcg; struct mem_cgroup *memcg;
int ret; int ret;
memcg = get_mem_cgroup_from_mm(mm); 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); css_put(&memcg->css);
if (ret == -EINTR) if (ret == -EINTR)
memcg = root_mem_cgroup; memcg = root_mem_cgroup;
...@@ -2900,8 +2894,7 @@ static int memcg_charge_kmem(struct mem_cgroup *memcg, gfp_t gfp, u64 size) ...@@ -2900,8 +2894,7 @@ static int memcg_charge_kmem(struct mem_cgroup *memcg, gfp_t gfp, u64 size)
if (ret) if (ret)
return ret; return ret;
ret = mem_cgroup_try_charge(memcg, gfp, size >> PAGE_SHIFT, ret = mem_cgroup_try_charge(memcg, gfp, size >> PAGE_SHIFT);
oom_gfp_allowed(gfp));
if (ret == -EINTR) { if (ret == -EINTR) {
/* /*
* mem_cgroup_try_charge() chosed to bypass to root due to * mem_cgroup_try_charge() chosed to bypass to root due to
...@@ -3650,7 +3643,6 @@ int mem_cgroup_charge_anon(struct page *page, ...@@ -3650,7 +3643,6 @@ int mem_cgroup_charge_anon(struct page *page,
{ {
unsigned int nr_pages = 1; unsigned int nr_pages = 1;
struct mem_cgroup *memcg; struct mem_cgroup *memcg;
bool oom = true;
if (mem_cgroup_disabled()) if (mem_cgroup_disabled())
return 0; return 0;
...@@ -3662,14 +3654,9 @@ int mem_cgroup_charge_anon(struct page *page, ...@@ -3662,14 +3654,9 @@ int mem_cgroup_charge_anon(struct page *page,
if (PageTransHuge(page)) { if (PageTransHuge(page)) {
nr_pages <<= compound_order(page); nr_pages <<= compound_order(page);
VM_BUG_ON_PAGE(!PageTransHuge(page), 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) if (!memcg)
return -ENOMEM; return -ENOMEM;
__mem_cgroup_commit_charge(memcg, page, nr_pages, __mem_cgroup_commit_charge(memcg, page, nr_pages,
...@@ -3706,7 +3693,7 @@ static int __mem_cgroup_try_charge_swapin(struct mm_struct *mm, ...@@ -3706,7 +3693,7 @@ static int __mem_cgroup_try_charge_swapin(struct mm_struct *mm,
memcg = try_get_mem_cgroup_from_page(page); memcg = try_get_mem_cgroup_from_page(page);
if (!memcg) if (!memcg)
memcg = get_mem_cgroup_from_mm(mm); 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); css_put(&memcg->css);
if (ret == -EINTR) if (ret == -EINTR)
memcg = root_mem_cgroup; memcg = root_mem_cgroup;
...@@ -3733,7 +3720,7 @@ int mem_cgroup_try_charge_swapin(struct mm_struct *mm, struct page *page, ...@@ -3733,7 +3720,7 @@ int mem_cgroup_try_charge_swapin(struct mm_struct *mm, struct page *page,
if (!PageSwapCache(page)) { if (!PageSwapCache(page)) {
struct mem_cgroup *memcg; 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) if (!memcg)
return -ENOMEM; return -ENOMEM;
*memcgp = memcg; *memcgp = memcg;
...@@ -3802,7 +3789,7 @@ int mem_cgroup_charge_file(struct page *page, struct mm_struct *mm, ...@@ -3802,7 +3789,7 @@ int mem_cgroup_charge_file(struct page *page, struct mm_struct *mm,
return 0; 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) if (!memcg)
return -ENOMEM; return -ENOMEM;
__mem_cgroup_commit_charge(memcg, page, 1, type, false); __mem_cgroup_commit_charge(memcg, page, 1, type, false);
...@@ -6440,7 +6427,8 @@ static int mem_cgroup_do_precharge(unsigned long count) ...@@ -6440,7 +6427,8 @@ static int mem_cgroup_do_precharge(unsigned long count)
batch_count = PRECHARGE_COUNT_AT_ONCE; batch_count = PRECHARGE_COUNT_AT_ONCE;
cond_resched(); 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) if (ret)
/* mem_cgroup_clear_mc() will do uncharge later */ /* mem_cgroup_clear_mc() will do uncharge later */
return ret; return ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册