Commit fc3ba692 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds

mm: Add NR_WRITEBACK_TEMP counter

Fuse will use temporary buffers to write back dirty data from memory mappings
(normal writes are done synchronously).  This is needed, because there cannot
be any guarantee about the time in which a write will complete.

By using temporary buffers, from the MM's point if view the page is written
back immediately.  If the writeout was due to memory pressure, this
effectively migrates data from a full zone to a less full zone.

This patch adds a new counter (NR_WRITEBACK_TEMP) for the number of pages used
as temporary buffers.

[Lee.Schermerhorn@hp.com: add vmstat_text for NR_WRITEBACK_TEMP]
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Cc: Christoph Lameter <clameter@sgi.com>
Signed-off-by: default avatarLee Schermerhorn <lee.schermerhorn@hp.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dd5656e5
...@@ -77,6 +77,7 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) ...@@ -77,6 +77,7 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
"Node %d PageTables: %8lu kB\n" "Node %d PageTables: %8lu kB\n"
"Node %d NFS_Unstable: %8lu kB\n" "Node %d NFS_Unstable: %8lu kB\n"
"Node %d Bounce: %8lu kB\n" "Node %d Bounce: %8lu kB\n"
"Node %d WritebackTmp: %8lu kB\n"
"Node %d Slab: %8lu kB\n" "Node %d Slab: %8lu kB\n"
"Node %d SReclaimable: %8lu kB\n" "Node %d SReclaimable: %8lu kB\n"
"Node %d SUnreclaim: %8lu kB\n", "Node %d SUnreclaim: %8lu kB\n",
...@@ -99,6 +100,7 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) ...@@ -99,6 +100,7 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
nid, K(node_page_state(nid, NR_PAGETABLE)), nid, K(node_page_state(nid, NR_PAGETABLE)),
nid, K(node_page_state(nid, NR_UNSTABLE_NFS)), nid, K(node_page_state(nid, NR_UNSTABLE_NFS)),
nid, K(node_page_state(nid, NR_BOUNCE)), nid, K(node_page_state(nid, NR_BOUNCE)),
nid, K(node_page_state(nid, NR_WRITEBACK_TEMP)),
nid, K(node_page_state(nid, NR_SLAB_RECLAIMABLE) + nid, K(node_page_state(nid, NR_SLAB_RECLAIMABLE) +
node_page_state(nid, NR_SLAB_UNRECLAIMABLE)), node_page_state(nid, NR_SLAB_UNRECLAIMABLE)),
nid, K(node_page_state(nid, NR_SLAB_RECLAIMABLE)), nid, K(node_page_state(nid, NR_SLAB_RECLAIMABLE)),
......
...@@ -179,6 +179,7 @@ static int meminfo_read_proc(char *page, char **start, off_t off, ...@@ -179,6 +179,7 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
"PageTables: %8lu kB\n" "PageTables: %8lu kB\n"
"NFS_Unstable: %8lu kB\n" "NFS_Unstable: %8lu kB\n"
"Bounce: %8lu kB\n" "Bounce: %8lu kB\n"
"WritebackTmp: %8lu kB\n"
"CommitLimit: %8lu kB\n" "CommitLimit: %8lu kB\n"
"Committed_AS: %8lu kB\n" "Committed_AS: %8lu kB\n"
"VmallocTotal: %8lu kB\n" "VmallocTotal: %8lu kB\n"
...@@ -210,6 +211,7 @@ static int meminfo_read_proc(char *page, char **start, off_t off, ...@@ -210,6 +211,7 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
K(global_page_state(NR_PAGETABLE)), K(global_page_state(NR_PAGETABLE)),
K(global_page_state(NR_UNSTABLE_NFS)), K(global_page_state(NR_UNSTABLE_NFS)),
K(global_page_state(NR_BOUNCE)), K(global_page_state(NR_BOUNCE)),
K(global_page_state(NR_WRITEBACK_TEMP)),
K(allowed), K(allowed),
K(committed), K(committed),
(unsigned long)VMALLOC_TOTAL >> 10, (unsigned long)VMALLOC_TOTAL >> 10,
......
...@@ -97,6 +97,7 @@ enum zone_stat_item { ...@@ -97,6 +97,7 @@ enum zone_stat_item {
NR_UNSTABLE_NFS, /* NFS unstable pages */ NR_UNSTABLE_NFS, /* NFS unstable pages */
NR_BOUNCE, NR_BOUNCE,
NR_VMSCAN_WRITE, NR_VMSCAN_WRITE,
NR_WRITEBACK_TEMP, /* Writeback using temporary buffers */
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
NUMA_HIT, /* allocated in intended node */ NUMA_HIT, /* allocated in intended node */
NUMA_MISS, /* allocated in non intended node */ NUMA_MISS, /* allocated in non intended node */
......
...@@ -211,7 +211,8 @@ clip_bdi_dirty_limit(struct backing_dev_info *bdi, long dirty, long *pbdi_dirty) ...@@ -211,7 +211,8 @@ clip_bdi_dirty_limit(struct backing_dev_info *bdi, long dirty, long *pbdi_dirty)
avail_dirty = dirty - avail_dirty = dirty -
(global_page_state(NR_FILE_DIRTY) + (global_page_state(NR_FILE_DIRTY) +
global_page_state(NR_WRITEBACK) + global_page_state(NR_WRITEBACK) +
global_page_state(NR_UNSTABLE_NFS)); global_page_state(NR_UNSTABLE_NFS) +
global_page_state(NR_WRITEBACK_TEMP));
if (avail_dirty < 0) if (avail_dirty < 0)
avail_dirty = 0; avail_dirty = 0;
......
...@@ -612,6 +612,7 @@ static const char * const vmstat_text[] = { ...@@ -612,6 +612,7 @@ static const char * const vmstat_text[] = {
"nr_unstable", "nr_unstable",
"nr_bounce", "nr_bounce",
"nr_vmscan_write", "nr_vmscan_write",
"nr_writeback_temp",
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
"numa_hit", "numa_hit",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment