|
@@ -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;
|
|
@@ -2647,9 +2645,6 @@ retry:
|
|
|
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))
|
|
@@ -2675,15 +2670,14 @@ done:
|
|
|
*/
|
|
|
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;
|
|
@@ -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
|
|
@@ -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;
|
|
@@ -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,
|
|
@@ -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;
|
|
@@ -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;
|
|
@@ -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);
|
|
@@ -6440,7 +6427,8 @@ one_by_one:
|
|
|
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;
|