On Tue 21-06-16 15:15:55, Mel Gorman wrote: > Reclaim makes decisions based on the number of pages that are mapped > but it's mixing node and zone information. Account NR_FILE_MAPPED and > NR_ANON_PAGES pages on the node. So we will lose this stat in /proc/zoneinfo, but I am not really sure we should bother much. I suspect we really want to introduce /proc/nodeinfo and deprecate the first one. I didn't get to such a patch and maybe it is not a part of the series, but I think we should eventually do it. > Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> > Acked-by: Vlastimil Babka <vbabka@xxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxxx> > --- > arch/tile/mm/pgtable.c | 2 +- > drivers/base/node.c | 4 ++-- > fs/proc/meminfo.c | 4 ++-- > include/linux/mmzone.h | 6 +++--- > mm/page_alloc.c | 6 +++--- > mm/rmap.c | 12 ++++++------ > mm/vmscan.c | 2 +- > mm/vmstat.c | 4 ++-- > 8 files changed, 20 insertions(+), 20 deletions(-) > > diff --git a/arch/tile/mm/pgtable.c b/arch/tile/mm/pgtable.c > index 9e389213580d..c606b0ef2f7e 100644 > --- a/arch/tile/mm/pgtable.c > +++ b/arch/tile/mm/pgtable.c > @@ -55,7 +55,7 @@ void show_mem(unsigned int filter) > global_page_state(NR_FREE_PAGES), > (global_page_state(NR_SLAB_RECLAIMABLE) + > global_page_state(NR_SLAB_UNRECLAIMABLE)), > - global_page_state(NR_FILE_MAPPED), > + global_node_page_state(NR_FILE_MAPPED), > global_page_state(NR_PAGETABLE), > global_page_state(NR_BOUNCE), > global_page_state(NR_FILE_PAGES), > diff --git a/drivers/base/node.c b/drivers/base/node.c > index 4260c7f3ee1b..66aed68a0fdc 100644 > --- a/drivers/base/node.c > +++ b/drivers/base/node.c > @@ -119,8 +119,8 @@ static ssize_t node_read_meminfo(struct device *dev, > nid, K(sum_zone_node_page_state(nid, NR_FILE_DIRTY)), > nid, K(sum_zone_node_page_state(nid, NR_WRITEBACK)), > nid, K(sum_zone_node_page_state(nid, NR_FILE_PAGES)), > - nid, K(sum_zone_node_page_state(nid, NR_FILE_MAPPED)), > - nid, K(sum_zone_node_page_state(nid, NR_ANON_PAGES)), > + nid, K(node_page_state(pgdat, NR_FILE_MAPPED)), > + nid, K(node_page_state(pgdat, NR_ANON_PAGES)), > nid, K(i.sharedram), > nid, sum_zone_node_page_state(nid, NR_KERNEL_STACK) * > THREAD_SIZE / 1024, > diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c > index 83720460c5bc..54e039682ec9 100644 > --- a/fs/proc/meminfo.c > +++ b/fs/proc/meminfo.c > @@ -138,8 +138,8 @@ static int meminfo_proc_show(struct seq_file *m, void *v) > K(i.freeswap), > K(global_page_state(NR_FILE_DIRTY)), > K(global_page_state(NR_WRITEBACK)), > - K(global_page_state(NR_ANON_PAGES)), > - K(global_page_state(NR_FILE_MAPPED)), > + K(global_node_page_state(NR_ANON_PAGES)), > + K(global_node_page_state(NR_FILE_MAPPED)), > K(i.sharedram), > K(global_page_state(NR_SLAB_RECLAIMABLE) + > global_page_state(NR_SLAB_UNRECLAIMABLE)), > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index ca9e05ca851d..8fafbd5fe74a 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -115,9 +115,6 @@ enum zone_stat_item { > NR_ZONE_LRU_ANON = NR_ZONE_LRU_BASE, > NR_ZONE_LRU_FILE, > NR_MLOCK, /* mlock()ed pages found and moved off LRU */ > - NR_ANON_PAGES, /* Mapped anonymous pages */ > - NR_FILE_MAPPED, /* pagecache pages mapped into pagetables. > - only modified from process context */ > NR_FILE_PAGES, > NR_FILE_DIRTY, > NR_WRITEBACK, > @@ -162,6 +159,9 @@ enum node_stat_item { > WORKINGSET_REFAULT, > WORKINGSET_ACTIVATE, > WORKINGSET_NODERECLAIM, > + NR_ANON_PAGES, /* Mapped anonymous pages */ > + NR_FILE_MAPPED, /* pagecache pages mapped into pagetables. > + only modified from process context */ > NR_VM_NODE_STAT_ITEMS > }; > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 962e98e54fd2..cf3523f399e5 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -4314,7 +4314,7 @@ void show_free_areas(unsigned int filter) > global_page_state(NR_UNSTABLE_NFS), > global_page_state(NR_SLAB_RECLAIMABLE), > global_page_state(NR_SLAB_UNRECLAIMABLE), > - global_page_state(NR_FILE_MAPPED), > + global_node_page_state(NR_FILE_MAPPED), > global_page_state(NR_SHMEM), > global_page_state(NR_PAGETABLE), > global_page_state(NR_BOUNCE), > @@ -4331,6 +4331,7 @@ void show_free_areas(unsigned int filter) > " unevictable:%lukB" > " isolated(anon):%lukB" > " isolated(file):%lukB" > + " mapped:%lukB" > " all_unreclaimable? %s" > "\n", > pgdat->node_id, > @@ -4341,6 +4342,7 @@ void show_free_areas(unsigned int filter) > K(node_page_state(pgdat, NR_UNEVICTABLE)), > K(node_page_state(pgdat, NR_ISOLATED_ANON)), > K(node_page_state(pgdat, NR_ISOLATED_FILE)), > + K(node_page_state(pgdat, NR_FILE_MAPPED)), > !pgdat_reclaimable(pgdat) ? "yes" : "no"); > } > > @@ -4365,7 +4367,6 @@ void show_free_areas(unsigned int filter) > " mlocked:%lukB" > " dirty:%lukB" > " writeback:%lukB" > - " mapped:%lukB" > " shmem:%lukB" > " slab_reclaimable:%lukB" > " slab_unreclaimable:%lukB" > @@ -4389,7 +4390,6 @@ void show_free_areas(unsigned int filter) > K(zone_page_state(zone, NR_MLOCK)), > K(zone_page_state(zone, NR_FILE_DIRTY)), > K(zone_page_state(zone, NR_WRITEBACK)), > - K(zone_page_state(zone, NR_FILE_MAPPED)), > K(zone_page_state(zone, NR_SHMEM)), > K(zone_page_state(zone, NR_SLAB_RECLAIMABLE)), > K(zone_page_state(zone, NR_SLAB_UNRECLAIMABLE)), > diff --git a/mm/rmap.c b/mm/rmap.c > index 67457f691528..dea2d115d68f 100644 > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -1219,7 +1219,7 @@ void do_page_add_anon_rmap(struct page *page, > __inc_zone_page_state(page, > NR_ANON_TRANSPARENT_HUGEPAGES); > } > - __mod_zone_page_state(page_zone(page), NR_ANON_PAGES, nr); > + __mod_node_page_state(page_pgdat(page), NR_ANON_PAGES, nr); > } > if (unlikely(PageKsm(page))) > return; > @@ -1263,7 +1263,7 @@ void page_add_new_anon_rmap(struct page *page, > /* increment count (starts at -1) */ > atomic_set(&page->_mapcount, 0); > } > - __mod_zone_page_state(page_zone(page), NR_ANON_PAGES, nr); > + __mod_node_page_state(page_pgdat(page), NR_ANON_PAGES, nr); > __page_set_anon_rmap(page, vma, address, 1); > } > > @@ -1277,7 +1277,7 @@ void page_add_file_rmap(struct page *page) > { > lock_page_memcg(page); > if (atomic_inc_and_test(&page->_mapcount)) { > - __inc_zone_page_state(page, NR_FILE_MAPPED); > + __inc_node_page_state(page, NR_FILE_MAPPED); > mem_cgroup_inc_page_stat(page, MEM_CGROUP_STAT_FILE_MAPPED); > } > unlock_page_memcg(page); > @@ -1303,7 +1303,7 @@ static void page_remove_file_rmap(struct page *page) > * these counters are not modified in interrupt context, and > * pte lock(a spinlock) is held, which implies preemption disabled. > */ > - __dec_zone_page_state(page, NR_FILE_MAPPED); > + __dec_node_page_state(page, NR_FILE_MAPPED); > mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_FILE_MAPPED); > > if (unlikely(PageMlocked(page))) > @@ -1345,7 +1345,7 @@ static void page_remove_anon_compound_rmap(struct page *page) > clear_page_mlock(page); > > if (nr) { > - __mod_zone_page_state(page_zone(page), NR_ANON_PAGES, -nr); > + __mod_node_page_state(page_pgdat(page), NR_ANON_PAGES, -nr); > deferred_split_huge_page(page); > } > } > @@ -1377,7 +1377,7 @@ void page_remove_rmap(struct page *page, bool compound) > * these counters are not modified in interrupt context, and > * pte lock(a spinlock) is held, which implies preemption disabled. > */ > - __dec_zone_page_state(page, NR_ANON_PAGES); > + __dec_node_page_state(page, NR_ANON_PAGES); > > if (unlikely(PageMlocked(page))) > clear_page_mlock(page); > diff --git a/mm/vmscan.c b/mm/vmscan.c > index cf73bf4ebd06..c6e958079398 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -3596,7 +3596,7 @@ int sysctl_min_slab_ratio = 5; > > static inline unsigned long zone_unmapped_file_pages(struct zone *zone) > { > - unsigned long file_mapped = zone_page_state(zone, NR_FILE_MAPPED); > + unsigned long file_mapped = node_page_state(zone->zone_pgdat, NR_FILE_MAPPED); > unsigned long file_lru = node_page_state(zone->zone_pgdat, NR_INACTIVE_FILE) + > node_page_state(zone->zone_pgdat, NR_ACTIVE_FILE); > > diff --git a/mm/vmstat.c b/mm/vmstat.c > index 81da18616ce6..12022ed481f0 100644 > --- a/mm/vmstat.c > +++ b/mm/vmstat.c > @@ -924,8 +924,6 @@ const char * const vmstat_text[] = { > "nr_zone_anon_lru", > "nr_zone_file_lru", > "nr_mlock", > - "nr_anon_pages", > - "nr_mapped", > "nr_file_pages", > "nr_dirty", > "nr_writeback", > @@ -967,6 +965,8 @@ const char * const vmstat_text[] = { > "workingset_refault", > "workingset_activate", > "workingset_nodereclaim", > + "nr_anon_pages", > + "nr_mapped", > > /* enum writeback_stat_item counters */ > "nr_dirty_threshold", > -- > 2.6.4 > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@xxxxxxxxx. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a> -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>