Conversion of nr_writeback to per zone counter.
This removes the last page_state counter from arch/i386/mm/pgtable.c so we
drop the page_state from there.
[akpm@osdl.org: bugfix]
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
        struct page *page;
        pg_data_t *pgdat;
        unsigned long i;
-       struct page_state ps;
        unsigned long flags;
 
        printk(KERN_INFO "Mem-info:\n");
        printk(KERN_INFO "%d pages shared\n", shared);
        printk(KERN_INFO "%d pages swap cached\n", cached);
 
-       get_page_state(&ps);
        printk(KERN_INFO "%lu pages dirty\n", global_page_state(NR_FILE_DIRTY));
-       printk(KERN_INFO "%lu pages writeback\n", ps.nr_writeback);
+       printk(KERN_INFO "%lu pages writeback\n",
+                                       global_page_state(NR_WRITEBACK));
        printk(KERN_INFO "%lu pages mapped\n", global_page_state(NR_FILE_MAPPED));
        printk(KERN_INFO "%lu pages slab\n", global_page_state(NR_SLAB));
        printk(KERN_INFO "%lu pages pagetables\n",
 
        get_page_state_node(&ps, nid);
        __get_zone_counts(&active, &inactive, &free, NODE_DATA(nid));
 
-       /* Check for negative values in these approximate counters */
-       if ((long)ps.nr_writeback < 0)
-               ps.nr_writeback = 0;
 
        n = sprintf(buf, "\n"
                       "Node %d MemTotal:     %8lu kB\n"
                       nid, K(i.totalram - i.totalhigh),
                       nid, K(i.freeram - i.freehigh),
                       nid, K(node_page_state(nid, NR_FILE_DIRTY)),
-                      nid, K(ps.nr_writeback),
+                      nid, K(node_page_state(nid, NR_WRITEBACK)),
                       nid, K(node_page_state(nid, NR_FILE_PAGES)),
                       nid, K(node_page_state(nid, NR_FILE_MAPPED)),
                       nid, K(node_page_state(nid, NR_ANON_PAGES)),
 
                K(i.totalswap),
                K(i.freeswap),
                K(global_page_state(NR_FILE_DIRTY)),
-               K(ps.nr_writeback),
+               K(global_page_state(NR_WRITEBACK)),
                K(global_page_state(NR_ANON_PAGES)),
                K(global_page_state(NR_FILE_MAPPED)),
                K(global_page_state(NR_SLAB)),
 
        NR_SLAB,        /* Pages used by slab allocator */
        NR_PAGETABLE,   /* used for pagetables */
        NR_FILE_DIRTY,
+       NR_WRITEBACK,
        NR_VM_ZONE_STAT_ITEMS };
 
 struct per_cpu_pages {
 
        do {                                                            \
                if (!test_and_set_bit(PG_writeback,                     \
                                &(page)->flags))                        \
-                       inc_page_state(nr_writeback);                   \
+                       inc_zone_page_state(page, NR_WRITEBACK);        \
        } while (0)
 #define TestSetPageWriteback(page)                                     \
        ({                                                              \
                ret = test_and_set_bit(PG_writeback,                    \
                                        &(page)->flags);                \
                if (!ret)                                               \
-                       inc_page_state(nr_writeback);                   \
+                       inc_zone_page_state(page, NR_WRITEBACK);        \
                ret;                                                    \
        })
 #define ClearPageWriteback(page)                                       \
        do {                                                            \
                if (test_and_clear_bit(PG_writeback,                    \
                                &(page)->flags))                        \
-                       dec_page_state(nr_writeback);                   \
+                       dec_zone_page_state(page, NR_WRITEBACK);        \
        } while (0)
 #define TestClearPageWriteback(page)                                   \
        ({                                                              \
                ret = test_and_clear_bit(PG_writeback,                  \
                                &(page)->flags);                        \
                if (ret)                                                \
-                       dec_page_state(nr_writeback);                   \
+                       dec_zone_page_state(page, NR_WRITEBACK);        \
                ret;                                                    \
        })
 
 
  * commented here.
  */
 struct page_state {
-       unsigned long nr_writeback;     /* Pages under writeback */
        unsigned long nr_unstable;      /* NFS unstable pages */
 #define GET_PAGE_STATE_LAST nr_unstable
 
 
        wbs->nr_unstable = read_page_state(nr_unstable);
        wbs->nr_mapped = global_page_state(NR_FILE_MAPPED) +
                                global_page_state(NR_ANON_PAGES);
-       wbs->nr_writeback = read_page_state(nr_writeback);
+       wbs->nr_writeback = global_page_state(NR_WRITEBACK);
 }
 
 /*
 
                active,
                inactive,
                global_page_state(NR_FILE_DIRTY),
-               ps.nr_writeback,
+               global_page_state(NR_WRITEBACK),
                ps.nr_unstable,
                nr_free_pages(),
                global_page_state(NR_SLAB),
 
        "nr_slab",
        "nr_page_table_pages",
        "nr_dirty",
+       "nr_writeback",
 
        /* Page state */
-       "nr_writeback",
        "nr_unstable",
 
        "pgpgin",