mm: move vmscan writes and file write accounting to the node
authorMel Gorman <mgorman@techsingularity.net>
Thu, 28 Jul 2016 22:46:23 +0000 (15:46 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 28 Jul 2016 23:07:41 +0000 (16:07 -0700)
As reclaim is now node-based, it follows that page write activity due to
page reclaim should also be accounted for on the node.  For consistency,
also account page writes and page dirtying on a per-node basis.

After this patch, there are a few remaining zone counters that may appear
strange but are fine.  NUMA stats are still per-zone as this is a
user-space interface that tools consume.  NR_MLOCK, NR_SLAB_*,
NR_PAGETABLE, NR_KERNEL_STACK and NR_BOUNCE are all allocations that
potentially pin low memory and cannot trivially be reclaimed on demand.
This information is still useful for debugging a page allocation failure
warning.

Link: http://lkml.kernel.org/r/1467970510-21195-21-git-send-email-mgorman@techsingularity.net
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Hillf Danton <hillf.zj@alibaba-inc.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Rik van Riel <riel@surriel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/mmzone.h
include/trace/events/writeback.h
mm/page-writeback.c
mm/vmscan.c
mm/vmstat.c

index acd4665c30251187e95a286dbe5e61434de5f978..e3d6d42722a07f49fd9cc8b35dc6e979c36b9290 100644 (file)
@@ -122,10 +122,6 @@ enum zone_stat_item {
        NR_KERNEL_STACK,
        /* Second 128 byte cacheline */
        NR_BOUNCE,
-       NR_VMSCAN_WRITE,
-       NR_VMSCAN_IMMEDIATE,    /* Prioritise for reclaim when writeback ends */
-       NR_DIRTIED,             /* page dirtyings since bootup */
-       NR_WRITTEN,             /* page writings since bootup */
 #if IS_ENABLED(CONFIG_ZSMALLOC)
        NR_ZSPAGES,             /* allocated in zsmalloc */
 #endif
@@ -165,6 +161,10 @@ enum node_stat_item {
        NR_SHMEM_PMDMAPPED,
        NR_ANON_THPS,
        NR_UNSTABLE_NFS,        /* NFS unstable pages */
+       NR_VMSCAN_WRITE,
+       NR_VMSCAN_IMMEDIATE,    /* Prioritise for reclaim when writeback ends */
+       NR_DIRTIED,             /* page dirtyings since bootup */
+       NR_WRITTEN,             /* page writings since bootup */
        NR_VM_NODE_STAT_ITEMS
 };
 
index ad20f2d2b1f957fd01e699467f573e77d21d1f17..2ccd9ccbf9efeaa7794eda0ca20589d42cf67784 100644 (file)
@@ -415,8 +415,8 @@ TRACE_EVENT(global_dirty_state,
                __entry->nr_dirty       = global_node_page_state(NR_FILE_DIRTY);
                __entry->nr_writeback   = global_node_page_state(NR_WRITEBACK);
                __entry->nr_unstable    = global_node_page_state(NR_UNSTABLE_NFS);
-               __entry->nr_dirtied     = global_page_state(NR_DIRTIED);
-               __entry->nr_written     = global_page_state(NR_WRITTEN);
+               __entry->nr_dirtied     = global_node_page_state(NR_DIRTIED);
+               __entry->nr_written     = global_node_page_state(NR_WRITTEN);
                __entry->background_thresh = background_thresh;
                __entry->dirty_thresh   = dirty_thresh;
                __entry->dirty_limit    = global_wb_domain.dirty_limit;
index f97591d9fa001792ab92e77f855fc3d0026d5530..3c02aa603f5a1a2344490a580d593f3fb0953d29 100644 (file)
@@ -2461,7 +2461,7 @@ void account_page_dirtied(struct page *page, struct address_space *mapping)
                mem_cgroup_inc_page_stat(page, MEM_CGROUP_STAT_DIRTY);
                __inc_node_page_state(page, NR_FILE_DIRTY);
                __inc_zone_page_state(page, NR_ZONE_WRITE_PENDING);
-               __inc_zone_page_state(page, NR_DIRTIED);
+               __inc_node_page_state(page, NR_DIRTIED);
                __inc_wb_stat(wb, WB_RECLAIMABLE);
                __inc_wb_stat(wb, WB_DIRTIED);
                task_io_account_write(PAGE_SIZE);
@@ -2550,7 +2550,7 @@ void account_page_redirty(struct page *page)
 
                wb = unlocked_inode_to_wb_begin(inode, &locked);
                current->nr_dirtied--;
-               dec_zone_page_state(page, NR_DIRTIED);
+               dec_node_page_state(page, NR_DIRTIED);
                dec_wb_stat(wb, WB_DIRTIED);
                unlocked_inode_to_wb_end(inode, locked);
        }
@@ -2787,7 +2787,7 @@ int test_clear_page_writeback(struct page *page)
                mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_WRITEBACK);
                dec_node_page_state(page, NR_WRITEBACK);
                dec_zone_page_state(page, NR_ZONE_WRITE_PENDING);
-               inc_zone_page_state(page, NR_WRITTEN);
+               inc_node_page_state(page, NR_WRITTEN);
        }
        unlock_page_memcg(page);
        return ret;
index b797afec3057ffc74a594ff50b84fe7b96edaa5e..9b61a55b6e3802ac0308a224c9353ee3cd520852 100644 (file)
@@ -612,7 +612,7 @@ static pageout_t pageout(struct page *page, struct address_space *mapping,
                        ClearPageReclaim(page);
                }
                trace_mm_vmscan_writepage(page);
-               inc_zone_page_state(page, NR_VMSCAN_WRITE);
+               inc_node_page_state(page, NR_VMSCAN_WRITE);
                return PAGE_SUCCESS;
        }
 
@@ -1117,7 +1117,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
                                 * except we already have the page isolated
                                 * and know it's dirty
                                 */
-                               inc_zone_page_state(page, NR_VMSCAN_IMMEDIATE);
+                               inc_node_page_state(page, NR_VMSCAN_IMMEDIATE);
                                SetPageReclaim(page);
 
                                goto keep_locked;
index 455392158062e4f0c291fe0ff75344fce397f62f..bc94968400d0d930de1a673342fe9ade42d7b82c 100644 (file)
@@ -931,10 +931,6 @@ const char * const vmstat_text[] = {
        "nr_page_table_pages",
        "nr_kernel_stack",
        "nr_bounce",
-       "nr_vmscan_write",
-       "nr_vmscan_immediate_reclaim",
-       "nr_dirtied",
-       "nr_written",
 #if IS_ENABLED(CONFIG_ZSMALLOC)
        "nr_zspages",
 #endif
@@ -971,6 +967,10 @@ const char * const vmstat_text[] = {
        "nr_shmem_pmdmapped",
        "nr_anon_transparent_hugepages",
        "nr_unstable",
+       "nr_vmscan_write",
+       "nr_vmscan_immediate_reclaim",
+       "nr_dirtied",
+       "nr_written",
 
        /* enum writeback_stat_item counters */
        "nr_dirty_threshold",