}
static void commit_charge(struct page *page, struct mem_cgroup *memcg,
- unsigned int nr_pages, bool lrucare)
+ bool lrucare)
{
struct page_cgroup *pc = lookup_page_cgroup(page);
int isolated;
if (lrucare)
unlock_page_lru(page, isolated);
-
- local_irq_disable();
- mem_cgroup_charge_statistics(memcg, page, nr_pages);
- /*
- * "charge_statistics" updated event counter. Then, check it.
- * Insert ancestor (and ancestor's ancestors), to softlimit RB-tree.
- * if they exceeds softlimit.
- */
- memcg_check_events(memcg, page);
- local_irq_enable();
}
static DEFINE_MUTEX(set_limit_mutex);
if (!memcg)
return;
+ commit_charge(page, memcg, lrucare);
+
if (PageTransHuge(page)) {
nr_pages <<= compound_order(page);
VM_BUG_ON_PAGE(!PageTransHuge(page), page);
}
- commit_charge(page, memcg, nr_pages, lrucare);
+ local_irq_disable();
+ mem_cgroup_charge_statistics(memcg, page, nr_pages);
+ memcg_check_events(memcg, page);
+ local_irq_enable();
if (do_swap_account && PageSwapCache(page)) {
swp_entry_t entry = { .val = page_private(page) };
void mem_cgroup_migrate(struct page *oldpage, struct page *newpage,
bool lrucare)
{
- unsigned int nr_pages = 1;
struct page_cgroup *pc;
int isolated;
VM_BUG_ON_PAGE(!lrucare && PageLRU(oldpage), oldpage);
VM_BUG_ON_PAGE(!lrucare && PageLRU(newpage), newpage);
VM_BUG_ON_PAGE(PageAnon(oldpage) != PageAnon(newpage), newpage);
+ VM_BUG_ON_PAGE(PageTransHuge(oldpage) != PageTransHuge(newpage),
+ newpage);
if (mem_cgroup_disabled())
return;
VM_BUG_ON_PAGE(!(pc->flags & PCG_MEM), oldpage);
VM_BUG_ON_PAGE(do_swap_account && !(pc->flags & PCG_MEMSW), oldpage);
- if (PageTransHuge(oldpage)) {
- nr_pages <<= compound_order(oldpage);
- VM_BUG_ON_PAGE(!PageTransHuge(oldpage), oldpage);
- VM_BUG_ON_PAGE(!PageTransHuge(newpage), newpage);
- }
-
if (lrucare)
lock_page_lru(oldpage, &isolated);
if (lrucare)
unlock_page_lru(oldpage, isolated);
- local_irq_disable();
- mem_cgroup_charge_statistics(pc->mem_cgroup, oldpage, -nr_pages);
- memcg_check_events(pc->mem_cgroup, oldpage);
- local_irq_enable();
-
- commit_charge(newpage, pc->mem_cgroup, nr_pages, lrucare);
+ commit_charge(newpage, pc->mem_cgroup, lrucare);
}
/*