mm: memcontrol: don't count limit-setting reclaim as memory pressure
[linux-2.6-microblaze.git] / mm / vmstat.c
index 3fb23a2..2b866cb 100644 (file)
@@ -341,6 +341,11 @@ void __mod_node_page_state(struct pglist_data *pgdat, enum node_stat_item item,
        long x;
        long t;
 
+       if (vmstat_item_in_bytes(item)) {
+               VM_WARN_ON_ONCE(delta & (PAGE_SIZE - 1));
+               delta >>= PAGE_SHIFT;
+       }
+
        x = delta + __this_cpu_read(*p);
 
        t = __this_cpu_read(pcp->stat_threshold);
@@ -398,6 +403,8 @@ void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item)
        s8 __percpu *p = pcp->vm_node_stat_diff + item;
        s8 v, t;
 
+       VM_WARN_ON_ONCE(vmstat_item_in_bytes(item));
+
        v = __this_cpu_inc_return(*p);
        t = __this_cpu_read(pcp->stat_threshold);
        if (unlikely(v > t)) {
@@ -442,6 +449,8 @@ void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item)
        s8 __percpu *p = pcp->vm_node_stat_diff + item;
        s8 v, t;
 
+       VM_WARN_ON_ONCE(vmstat_item_in_bytes(item));
+
        v = __this_cpu_dec_return(*p);
        t = __this_cpu_read(pcp->stat_threshold);
        if (unlikely(v < - t)) {
@@ -541,6 +550,11 @@ static inline void mod_node_state(struct pglist_data *pgdat,
        s8 __percpu *p = pcp->vm_node_stat_diff + item;
        long o, n, t, z;
 
+       if (vmstat_item_in_bytes(item)) {
+               VM_WARN_ON_ONCE(delta & (PAGE_SIZE - 1));
+               delta >>= PAGE_SHIFT;
+       }
+
        do {
                z = 0;  /* overflow to node counters */
 
@@ -989,8 +1003,8 @@ unsigned long sum_zone_numa_state(int node,
 /*
  * Determine the per node value of a stat item.
  */
-unsigned long node_page_state(struct pglist_data *pgdat,
-                               enum node_stat_item item)
+unsigned long node_page_state_pages(struct pglist_data *pgdat,
+                                   enum node_stat_item item)
 {
        long x = atomic_long_read(&pgdat->vm_stat[item]);
 #ifdef CONFIG_SMP
@@ -999,6 +1013,14 @@ unsigned long node_page_state(struct pglist_data *pgdat,
 #endif
        return x;
 }
+
+unsigned long node_page_state(struct pglist_data *pgdat,
+                             enum node_stat_item item)
+{
+       VM_WARN_ON_ONCE(vmstat_item_in_bytes(item));
+
+       return node_page_state_pages(pgdat, item);
+}
 #endif
 
 #ifdef CONFIG_COMPACTION
@@ -1118,10 +1140,6 @@ const char * const vmstat_text[] = {
        "nr_zone_write_pending",
        "nr_mlock",
        "nr_page_table_pages",
-       "nr_kernel_stack",
-#if IS_ENABLED(CONFIG_SHADOW_CALL_STACK)
-       "nr_shadow_call_stack",
-#endif
        "nr_bounce",
 #if IS_ENABLED(CONFIG_ZSMALLOC)
        "nr_zspages",
@@ -1172,6 +1190,10 @@ const char * const vmstat_text[] = {
        "nr_kernel_misc_reclaimable",
        "nr_foll_pin_acquired",
        "nr_foll_pin_released",
+       "nr_kernel_stack",
+#if IS_ENABLED(CONFIG_SHADOW_CALL_STACK)
+       "nr_shadow_call_stack",
+#endif
 
        /* enum writeback_stat_item counters */
        "nr_dirty_threshold",
@@ -1577,7 +1599,7 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,
                seq_printf(m, "\n  per-node stats");
                for (i = 0; i < NR_VM_NODE_STAT_ITEMS; i++) {
                        seq_printf(m, "\n      %-12s %lu", node_stat_name(i),
-                                  node_page_state(pgdat, i));
+                                  node_page_state_pages(pgdat, i));
                }
        }
        seq_printf(m,
@@ -1698,7 +1720,7 @@ static void *vmstat_start(struct seq_file *m, loff_t *pos)
 #endif
 
        for (i = 0; i < NR_VM_NODE_STAT_ITEMS; i++)
-               v[i] = global_node_page_state(i);
+               v[i] = global_node_page_state_pages(i);
        v += NR_VM_NODE_STAT_ITEMS;
 
        global_dirty_limits(v + NR_DIRTY_BG_THRESHOLD,