History

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.

Konstantin Khlebnikov committed 7 years ago

Commit ae8af431 parent b918c431 file · +12 −6Browse files

Unified · Split

mm/memcontrol.c+12−6
@@ -5420,6 +5420,8 @@ static int mem_cgroup_move_account(struct page *page, · 5419 unmodified lines
54205420 struct mem_cgroup *from,
54215421 struct mem_cgroup *to)
54225422 {
5423+ struct lruvec *from_vec, *to_vec;
5424+ struct pglist_data *pgdat;
54235425 unsigned long flags;
54245426 unsigned int nr_pages = compound ? hpage_nr_pages(page) : 1;
54255427 int ret;
@@ -5443,11 +5445,15 @@ static int mem_cgroup_move_account(struct page *page, · 17 unmodified lines
54435445
54445446 anon = PageAnon(page);
54455447
5448+ pgdat = page_pgdat(page);
5449+ from_vec = mem_cgroup_lruvec(pgdat, from);
5450+ to_vec = mem_cgroup_lruvec(pgdat, to);
5451+
54465452 spin_lock_irqsave(&from->move_lock, flags);
54475453
54485454 if (!anon && page_mapped(page)) {
5449− __mod_memcg_state(from, NR_FILE_MAPPED, -nr_pages);
5450− __mod_memcg_state(to, NR_FILE_MAPPED, nr_pages);
5455+ __mod_lruvec_state(from_vec, NR_FILE_MAPPED, -nr_pages);
5456+ __mod_lruvec_state(to_vec, NR_FILE_MAPPED, nr_pages);
54515457 }
54525458
54535459 /*
@@ -5459,14 +5465,14 @@ static int mem_cgroup_move_account(struct page *page, · 5 unmodified lines
54595465 struct address_space *mapping = page_mapping(page);
54605466
54615467 if (mapping_cap_account_dirty(mapping)) {
5462− __mod_memcg_state(from, NR_FILE_DIRTY, -nr_pages);
5463− __mod_memcg_state(to, NR_FILE_DIRTY, nr_pages);
5468+ __mod_lruvec_state(from_vec, NR_FILE_DIRTY, -nr_pages);
5469+ __mod_lruvec_state(to_vec, NR_FILE_DIRTY, nr_pages);
54645470 }
54655471 }
54665472
54675473 if (PageWriteback(page)) {
5468− __mod_memcg_state(from, NR_WRITEBACK, -nr_pages);
5469− __mod_memcg_state(to, NR_WRITEBACK, nr_pages);
5474+ __mod_lruvec_state(from_vec, NR_WRITEBACK, -nr_pages);
5475+ __mod_lruvec_state(to_vec, NR_WRITEBACK, nr_pages);
54705476 }
54715477
54725478 #ifdef CONFIG_TRANSPARENT_HUGEPAGE