mm/memcontrol: update lruvec counters in mem_cgroup_move_account
Subsystems (2)
[email protected]
maintainerPATCH 16/26 mm/memcontrol: update lruvec counters in mem_cgroup_move_account
From: Konstantin Khlebnikov <[email protected]>
Subject: mm/memcontrol: update lruvec counters in mem_cgroup_move_account
Mapped, dirty and writeback pages are also counted in per-lruvec stats. These counters needs update when page is moved between cgroups.
Currently is nobody *consuming* the lruvec versions of these counters and that there is no user-visible effect.
Fixes 00f3ca2c2d66 ("mm: memcontrol: per-lruvec stats infrastructure")
Signed-off-by Konstantin Khlebnikov <[email protected]>
Acked-by Johannes Weiner <[email protected]>
Acked-by Michal Hocko <[email protected]>
Cc Vladimir Davydov <[email protected]
Signed-off-by Andrew Morton <[email protected]>
---
mm/memcontrol.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
mm/memcontrol.c renamed from mm/memcontrol.c~mm-memcontrol-update-lruvec-counters-in-mem_cgroup_move_account +12 -6
@@ -5420,6 +5420,8 @@ static int mem_cgroup_move_account(strucstruct mem_cgroup *from, struct mem_cgroup *to) { + struct lruvec *from_vec, *to_vec; +struct pglist_data *pgdat;unsigned long flags;unsigned int nr_pages = compound ?hpage_nr_pages (page) :1 ;int ret;
@@ -5443,11 +5445,15 @@ static int mem_cgroup_move_account(struc anon =PageAnon (page); + pgdat =page_pgdat (page); + from_vec =mem_cgroup_lruvec (pgdat, from); + to_vec =mem_cgroup_lruvec (pgdat, to); +spin_lock_irqsave (&from->move_lock, flags);if (!anon &&page_mapped (page)) { -__mod_memcg_state (from,NR_FILE_MAPPED , -nr_pages); -__mod_memcg_state (to,NR_FILE_MAPPED , nr_pages); +__mod_lruvec_state (from_vec,NR_FILE_MAPPED , -nr_pages); +__mod_lruvec_state (to_vec,NR_FILE_MAPPED , nr_pages); }/*
@@ -5459,14 +5465,14 @@ static int mem_cgroup_move_account(strucstruct address_space *mapping =page_mapping (page);if (mapping_cap_account_dirty (mapping)) { -__mod_memcg_state (from,NR_FILE_DIRTY , -nr_pages); -__mod_memcg_state (to,NR_FILE_DIRTY , nr_pages); +__mod_lruvec_state (from_vec,NR_FILE_DIRTY , -nr_pages); +__mod_lruvec_state (to_vec,NR_FILE_DIRTY , nr_pages); } }if (PageWriteback (page)) { -__mod_memcg_state (from,NR_WRITEBACK , -nr_pages); -__mod_memcg_state (to,NR_WRITEBACK , nr_pages); +__mod_lruvec_state (from_vec,NR_WRITEBACK , -nr_pages); +__mod_lruvec_state (to_vec,NR_WRITEBACK , nr_pages); }#ifdef CONFIG_TRANSPARENT_HUGEPAGE
_