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.
Unified · Split
| @@ -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_HUGEPAGE | 5478 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |