]> err.no Git - linux-2.6/blobdiff - include/linux/mmzone.h
[PATCH] zoned vm counters: conversion of nr_writeback to per zone counter
[linux-2.6] / include / linux / mmzone.h
index 36740354d4db474c7034beaff63f558891f1f6bc..885cc9727001cc93c692fd039de81c2b0c126b82 100644 (file)
@@ -4,7 +4,6 @@
 #ifdef __KERNEL__
 #ifndef __ASSEMBLY__
 
-#include <linux/config.h>
 #include <linux/spinlock.h>
 #include <linux/list.h>
 #include <linux/wait.h>
@@ -15,6 +14,7 @@
 #include <linux/seqlock.h>
 #include <linux/nodemask.h>
 #include <asm/atomic.h>
+#include <asm/page.h>
 
 /* Free memory management - zoned buddy allocator.  */
 #ifndef CONFIG_FORCE_MAX_ZONEORDER
@@ -46,6 +46,17 @@ struct zone_padding {
 #define ZONE_PADDING(name)
 #endif
 
+enum zone_stat_item {
+       NR_ANON_PAGES,  /* Mapped anonymous pages */
+       NR_FILE_MAPPED, /* pagecache pages mapped into pagetables.
+                          only modified from process context */
+       NR_FILE_PAGES,
+       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 {
        int count;              /* number of pages in the list */
        int high;               /* high watermark, emptying needed */
@@ -55,6 +66,10 @@ struct per_cpu_pages {
 
 struct per_cpu_pageset {
        struct per_cpu_pages pcp[2];    /* 0: hot.  1: cold */
+#ifdef CONFIG_SMP
+       s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS];
+#endif
+
 #ifdef CONFIG_NUMA
        unsigned long numa_hit;         /* allocated in intended node */
        unsigned long numa_miss;        /* allocated in non intended node */
@@ -165,12 +180,8 @@ struct zone {
        /* A count of how many reclaimers are scanning this zone */
        atomic_t                reclaim_in_progress;
 
-       /*
-        * timestamp (in jiffies) of the last zone reclaim that did not
-        * result in freeing of pages. This is used to avoid repeated scans
-        * if all memory in the zone is in use.
-        */
-       unsigned long           last_unsuccessful_zone_reclaim;
+       /* Zone statistics */
+       atomic_long_t           vm_stat[NR_VM_ZONE_STAT_ITEMS];
 
        /*
         * prev_priority holds the scanning priority for this zone.  It is
@@ -197,7 +208,7 @@ struct zone {
 
        /*
         * wait_table           -- the array holding the hash table
-        * wait_table_size      -- the size of the hash table array
+        * wait_table_hash_nr_entries   -- the size of the hash table array
         * wait_table_bits      -- wait_table_size == (1 << wait_table_bits)
         *
         * The purpose of all these is to keep track of the people
@@ -220,7 +231,7 @@ struct zone {
         * free_area_init_core() performs the initialization of them.
         */
        wait_queue_head_t       * wait_table;
-       unsigned long           wait_table_size;
+       unsigned long           wait_table_hash_nr_entries;
        unsigned long           wait_table_bits;
 
        /*
@@ -333,6 +344,9 @@ void wakeup_kswapd(struct zone *zone, int order);
 int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
                int classzone_idx, int alloc_flags);
 
+extern int init_currently_empty_zone(struct zone *zone, unsigned long start_pfn,
+                                    unsigned long size);
+
 #ifdef CONFIG_HAVE_MEMORY_PRESENT
 void memory_present(int nid, unsigned long start, unsigned long end);
 #else
@@ -506,6 +520,10 @@ struct mem_section {
         * pages.  However, it is stored with some other magic.
         * (see sparse.c::sparse_init_one_section())
         *
+        * Additionally during early boot we encode node id of
+        * the location of the section here to guide allocation.
+        * (see sparse.c::memory_present())
+        *
         * Making it a UL at least makes someone do a cast
         * before using it wrong.
         */
@@ -545,6 +563,7 @@ extern int __section_nr(struct mem_section* ms);
 #define SECTION_HAS_MEM_MAP    (1UL<<1)
 #define SECTION_MAP_LAST_BIT   (1UL<<2)
 #define SECTION_MAP_MASK       (~(SECTION_MAP_LAST_BIT-1))
+#define SECTION_NID_SHIFT      2
 
 static inline struct page *__section_mem_map_addr(struct mem_section *section)
 {