summaryrefslogtreecommitdiff
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index bc0f55d0cc087..c414b7f85e48c 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -6637,6 +6637,33 @@ void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg)
cancel_charge(memcg, nr_pages);
}
+/**
+ * mem_cgroup_charge - charge a newly allocated page to a cgroup
+ * @page: page to charge
+ * @mm: mm context of the victim
+ * @gfp_mask: reclaim mode
+ * @lrucare: page might be on the LRU already
+ *
+ * Try to charge @page to the memcg that @mm belongs to, reclaiming
+ * pages according to @gfp_mask if necessary.
+ *
+ * Returns 0 on success. Otherwise, an error code is returned.
+ */
+int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask,
+ bool lrucare)
+{
+ struct mem_cgroup *memcg;
+ int ret;
+
+ VM_BUG_ON_PAGE(!page->mapping, page);
+
+ ret = mem_cgroup_try_charge(page, mm, gfp_mask, &memcg);
+ if (ret)
+ return ret;
+ mem_cgroup_commit_charge(page, memcg, lrucare);
+ return 0;
+}
+
struct uncharge_gather {
struct mem_cgroup *memcg;
unsigned long pgpgout;
@@ -6684,8 +6711,6 @@ static void uncharge_batch(const struct uncharge_gather *ug)
static void uncharge_page(struct page *page, struct uncharge_gather *ug)
{
VM_BUG_ON_PAGE(PageLRU(page), page);
- VM_BUG_ON_PAGE(page_count(page) && !is_zone_device_page(page) &&
- !PageHWPoison(page) , page);
if (!page->mem_cgroup)
return;