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
5420 struct mem_cgroup *from,5420 struct mem_cgroup *from,
5421 struct mem_cgroup *to)5421 struct mem_cgroup *to)
5422{5422{
5423 struct lruvec *from_vec, *to_vec;
5424 struct pglist_data *pgdat;
5423 unsigned long flags;5425 unsigned long flags;
5424 unsigned int nr_pages = compound ? hpage_nr_pages(page) : 1;5426 unsigned int nr_pages = compound ? hpage_nr_pages(page) : 1;
5425 int ret;5427 int ret;
@@ -5443,11 +5445,15 @@ static int mem_cgroup_move_account(struct page *page, · 17 unmodified lines
5443 5445
5444 anon = PageAnon(page);5446 anon = PageAnon(page);
5445 5447
5448 pgdat = page_pgdat(page);
5449 from_vec = mem_cgroup_lruvec(pgdat, from);
5450 to_vec = mem_cgroup_lruvec(pgdat, to);
5451
5446 spin_lock_irqsave(&from->move_lock, flags);5452 spin_lock_irqsave(&from->move_lock, flags);
5447 5453
5448 if (!anon && page_mapped(page)) {5454 if (!anon && page_mapped(page)) {
5449 __mod_memcg_state(from, NR_FILE_MAPPED, -nr_pages);5455 __mod_lruvec_state(from_vec, NR_FILE_MAPPED, -nr_pages);
5450 __mod_memcg_state(to, NR_FILE_MAPPED, nr_pages);5456 __mod_lruvec_state(to_vec, NR_FILE_MAPPED, nr_pages);
5451 }5457 }
5452 5458
5453 /*5459 /*
@@ -5459,14 +5465,14 @@ static int mem_cgroup_move_account(struct page *page, · 5 unmodified lines
5459 struct address_space *mapping = page_mapping(page);5465 struct address_space *mapping = page_mapping(page);
5460 5466
5461 if (mapping_cap_account_dirty(mapping)) {5467 if (mapping_cap_account_dirty(mapping)) {
5462 __mod_memcg_state(from, NR_FILE_DIRTY, -nr_pages);5468 __mod_lruvec_state(from_vec, NR_FILE_DIRTY, -nr_pages);
5463 __mod_memcg_state(to, NR_FILE_DIRTY, nr_pages);5469 __mod_lruvec_state(to_vec, NR_FILE_DIRTY, nr_pages);
5464 }5470 }
5465 }5471 }
5466 5472
5467 if (PageWriteback(page)) {5473 if (PageWriteback(page)) {
5468 __mod_memcg_state(from, NR_WRITEBACK, -nr_pages);5474 __mod_lruvec_state(from_vec, NR_WRITEBACK, -nr_pages);
5469 __mod_memcg_state(to, NR_WRITEBACK, nr_pages);5475 __mod_lruvec_state(to_vec, NR_WRITEBACK, nr_pages);
5470 }5476 }
5471 5477
5472#ifdef CONFIG_TRANSPARENT_HUGEPAGE5478#ifdef CONFIG_TRANSPARENT_HUGEPAGE