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 | 5420 | struct mem_cgroup *from, |
| 5421 | 5421 | struct mem_cgroup *to) |
| 5422 | 5422 | { |
| 5423 | + struct lruvec *from_vec, *to_vec; | |
| 5424 | + struct pglist_data *pgdat; | |
| 5423 | 5425 | unsigned long flags; |
| 5424 | 5426 | unsigned int nr_pages = compound ? hpage_nr_pages(page) : 1; |
| 5425 | 5427 | int ret; |
| @@ -5443,11 +5445,15 @@ static int mem_cgroup_move_account(struct page *page, · 17 unmodified lines | ||
| 5443 | 5445 | |
| 5444 | 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 | 5452 | spin_lock_irqsave(&from->move_lock, flags); |
| 5447 | 5453 | |
| 5448 | 5454 | 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); | |
| 5451 | 5457 | } |
| 5452 | 5458 | |
| 5453 | 5459 | /* |
| @@ -5459,14 +5465,14 @@ static int mem_cgroup_move_account(struct page *page, · 5 unmodified lines | ||
| 5459 | 5465 | struct address_space *mapping = page_mapping(page); |
| 5460 | 5466 | |
| 5461 | 5467 | 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); | |
| 5464 | 5470 | } |
| 5465 | 5471 | } |
| 5466 | 5472 | |
| 5467 | 5473 | 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); | |
| 5470 | 5476 | } |
| 5471 | 5477 | |
| 5472 | 5478 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |