int n = 0;
 
        for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
-               n += sprintf(buf+n, "%s %lu\n", vmstat_text[i],
+               n += sprintf(buf+n, "%s %lu\n", zone_stat_name(i),
                             sum_zone_node_page_state(nid, i));
 
 #ifdef CONFIG_NUMA
        for (i = 0; i < NR_VM_NUMA_STAT_ITEMS; i++)
-               n += sprintf(buf+n, "%s %lu\n",
-                            vmstat_text[i + NR_VM_ZONE_STAT_ITEMS],
+               n += sprintf(buf+n, "%s %lu\n", numa_stat_name(i),
                             sum_zone_numa_state(nid, i));
 #endif
 
        for (i = 0; i < NR_VM_NODE_STAT_ITEMS; i++)
-               n += sprintf(buf+n, "%s %lu\n",
-                            vmstat_text[i + NR_VM_ZONE_STAT_ITEMS +
-                            NR_VM_NUMA_STAT_ITEMS],
+               n += sprintf(buf+n, "%s %lu\n", node_stat_name(i),
                             node_page_state(pgdat, i));
 
        return n;
 
        unsigned nr_unmap_fail;
 };
 
+enum writeback_stat_item {
+       NR_DIRTY_THRESHOLD,
+       NR_DIRTY_BG_THRESHOLD,
+       NR_VM_WRITEBACK_STAT_ITEMS,
+};
+
 #ifdef CONFIG_VM_EVENT_COUNTERS
 /*
  * Light weight per cpu counter implementation.
 
 extern const char * const vmstat_text[];
 
+static inline const char *zone_stat_name(enum zone_stat_item item)
+{
+       return vmstat_text[item];
+}
+
+#ifdef CONFIG_NUMA
+static inline const char *numa_stat_name(enum numa_stat_item item)
+{
+       return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
+                          item];
+}
+#endif /* CONFIG_NUMA */
+
+static inline const char *node_stat_name(enum node_stat_item item)
+{
+       return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
+                          NR_VM_NUMA_STAT_ITEMS +
+                          item];
+}
+
+static inline const char *lru_list_name(enum lru_list lru)
+{
+       return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
+}
+
+static inline const char *writeback_stat_name(enum writeback_stat_item item)
+{
+       return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
+                          NR_VM_NUMA_STAT_ITEMS +
+                          NR_VM_NODE_STAT_ITEMS +
+                          item];
+}
+
+#ifdef CONFIG_VM_EVENT_COUNTERS
+static inline const char *vm_event_name(enum vm_event_item item)
+{
+       return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
+                          NR_VM_NUMA_STAT_ITEMS +
+                          NR_VM_NODE_STAT_ITEMS +
+                          NR_VM_WRITEBACK_STAT_ITEMS +
+                          item];
+}
+#endif /* CONFIG_VM_EVENT_COUNTERS */
+
 #endif /* _LINUX_VMSTAT_H */
 
        "numa_other",
 #endif
 
-       /* Node-based counters */
+       /* enum node_stat_item counters */
        "nr_inactive_anon",
        "nr_active_anon",
        "nr_inactive_file",
        if (is_zone_first_populated(pgdat, zone)) {
                seq_printf(m, "\n  per-node stats");
                for (i = 0; i < NR_VM_NODE_STAT_ITEMS; i++) {
-                       seq_printf(m, "\n      %-12s %lu",
-                               vmstat_text[i + NR_VM_ZONE_STAT_ITEMS +
-                               NR_VM_NUMA_STAT_ITEMS],
-                               node_page_state(pgdat, i));
+                       seq_printf(m, "\n      %-12s %lu", node_stat_name(i),
+                                  node_page_state(pgdat, i));
                }
        }
        seq_printf(m,
        }
 
        for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
-               seq_printf(m, "\n      %-12s %lu", vmstat_text[i],
-                               zone_page_state(zone, i));
+               seq_printf(m, "\n      %-12s %lu", zone_stat_name(i),
+                          zone_page_state(zone, i));
 
 #ifdef CONFIG_NUMA
        for (i = 0; i < NR_VM_NUMA_STAT_ITEMS; i++)
-               seq_printf(m, "\n      %-12s %lu",
-                               vmstat_text[i + NR_VM_ZONE_STAT_ITEMS],
-                               zone_numa_state_snapshot(zone, i));
+               seq_printf(m, "\n      %-12s %lu", numa_stat_name(i),
+                          zone_numa_state_snapshot(zone, i));
 #endif
 
        seq_printf(m, "\n  pagesets");
        .show   = zoneinfo_show,
 };
 
-enum writeback_stat_item {
-       NR_DIRTY_THRESHOLD,
-       NR_DIRTY_BG_THRESHOLD,
-       NR_VM_WRITEBACK_STAT_ITEMS,
-};
+#define NR_VMSTAT_ITEMS (NR_VM_ZONE_STAT_ITEMS + \
+                        NR_VM_NUMA_STAT_ITEMS + \
+                        NR_VM_NODE_STAT_ITEMS + \
+                        NR_VM_WRITEBACK_STAT_ITEMS + \
+                        (IS_ENABLED(CONFIG_VM_EVENT_COUNTERS) ? \
+                         NR_VM_EVENT_ITEMS : 0))
 
 static void *vmstat_start(struct seq_file *m, loff_t *pos)
 {
        unsigned long *v;
-       int i, stat_items_size;
+       int i;
 
-       if (*pos >= ARRAY_SIZE(vmstat_text))
+       if (*pos >= NR_VMSTAT_ITEMS)
                return NULL;
-       stat_items_size = NR_VM_ZONE_STAT_ITEMS * sizeof(unsigned long) +
-                         NR_VM_NUMA_STAT_ITEMS * sizeof(unsigned long) +
-                         NR_VM_NODE_STAT_ITEMS * sizeof(unsigned long) +
-                         NR_VM_WRITEBACK_STAT_ITEMS * sizeof(unsigned long);
-
-#ifdef CONFIG_VM_EVENT_COUNTERS
-       stat_items_size += sizeof(struct vm_event_state);
-#endif
 
-       BUILD_BUG_ON(stat_items_size !=
-                    ARRAY_SIZE(vmstat_text) * sizeof(unsigned long));
-       v = kmalloc(stat_items_size, GFP_KERNEL);
+       BUILD_BUG_ON(ARRAY_SIZE(vmstat_text) < NR_VMSTAT_ITEMS);
+       v = kmalloc_array(NR_VMSTAT_ITEMS, sizeof(unsigned long), GFP_KERNEL);
        m->private = v;
        if (!v)
                return ERR_PTR(-ENOMEM);
 static void *vmstat_next(struct seq_file *m, void *arg, loff_t *pos)
 {
        (*pos)++;
-       if (*pos >= ARRAY_SIZE(vmstat_text))
+       if (*pos >= NR_VMSTAT_ITEMS)
                return NULL;
        return (unsigned long *)m->private + *pos;
 }
                val = atomic_long_read(&vm_zone_stat[i]);
                if (val < 0) {
                        pr_warn("%s: %s %ld\n",
-                               __func__, vmstat_text[i], val);
+                               __func__, zone_stat_name(i), val);
                        err = -EINVAL;
                }
        }
                val = atomic_long_read(&vm_numa_stat[i]);
                if (val < 0) {
                        pr_warn("%s: %s %ld\n",
-                               __func__, vmstat_text[i + NR_VM_ZONE_STAT_ITEMS], val);
+                               __func__, numa_stat_name(i), val);
                        err = -EINVAL;
                }
        }