MEMCG_NR_STAT,
 };
 
-/* Cgroup-specific events, on top of universal VM events */
-enum memcg_event_item {
-       MEMCG_LOW = NR_VM_EVENT_ITEMS,
+enum memcg_memory_event {
+       MEMCG_LOW,
        MEMCG_HIGH,
        MEMCG_MAX,
        MEMCG_OOM,
-       MEMCG_NR_EVENTS,
+       MEMCG_NR_MEMORY_EVENTS,
 };
 
 struct mem_cgroup_reclaim_cookie {
 
 struct mem_cgroup_stat_cpu {
        long count[MEMCG_NR_STAT];
-       unsigned long events[MEMCG_NR_EVENTS];
+       unsigned long events[NR_VM_EVENT_ITEMS];
        unsigned long nr_page_events;
        unsigned long targets[MEM_CGROUP_NTARGETS];
 };
        /* OOM-Killer disable */
        int             oom_kill_disable;
 
-       /* handle for "memory.events" */
+       /* memory.events */
+       atomic_long_t memory_events[MEMCG_NR_MEMORY_EVENTS];
        struct cgroup_file events_file;
 
        /* protect arrays of thresholds */
        struct task_struct      *move_lock_task;
        unsigned long           move_lock_flags;
 
+       /* memory.stat */
        struct mem_cgroup_stat_cpu __percpu *stat_cpu;
        atomic_long_t           stat[MEMCG_NR_STAT];
-       atomic_long_t           events[MEMCG_NR_EVENTS];
+       atomic_long_t           events[NR_VM_EVENT_ITEMS];
 
        unsigned long           socket_pressure;
 
                                                gfp_t gfp_mask,
                                                unsigned long *total_scanned);
 
-/* idx can be of type enum memcg_event_item or vm_event_item */
 static inline void __count_memcg_events(struct mem_cgroup *memcg,
-                                       int idx, unsigned long count)
+                                       enum vm_event_item idx,
+                                       unsigned long count)
 {
        unsigned long x;
 
 }
 
 static inline void count_memcg_events(struct mem_cgroup *memcg,
-                                     int idx, unsigned long count)
+                                     enum vm_event_item idx,
+                                     unsigned long count)
 {
        unsigned long flags;
 
        local_irq_restore(flags);
 }
 
-/* idx can be of type enum memcg_event_item or vm_event_item */
 static inline void count_memcg_page_event(struct page *page,
-                                         int idx)
+                                         enum vm_event_item idx)
 {
        if (page->mem_cgroup)
                count_memcg_events(page->mem_cgroup, idx, 1);
        rcu_read_unlock();
 }
 
-static inline void mem_cgroup_event(struct mem_cgroup *memcg,
-                                   enum memcg_event_item event)
+static inline void memcg_memory_event(struct mem_cgroup *memcg,
+                                     enum memcg_memory_event event)
 {
-       count_memcg_events(memcg, event, 1);
+       atomic_long_inc(&memcg->memory_events[event]);
        cgroup_file_notify(&memcg->events_file);
 }
 
        return true;
 }
 
-static inline void mem_cgroup_event(struct mem_cgroup *memcg,
-                                   enum memcg_event_item event)
+static inline void memcg_memory_event(struct mem_cgroup *memcg,
+                                     enum memcg_memory_event event)
 {
 }
 
 
                        }
                }
 
-               for (i = 0; i < MEMCG_NR_EVENTS; i++) {
+               for (i = 0; i < NR_VM_EVENT_ITEMS; i++) {
                        long x;
 
                        x = this_cpu_xchg(memcg->stat_cpu->events[i], 0);
        do {
                if (page_counter_read(&memcg->memory) <= memcg->high)
                        continue;
-               mem_cgroup_event(memcg, MEMCG_HIGH);
+               memcg_memory_event(memcg, MEMCG_HIGH);
                try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, true);
        } while ((memcg = parent_mem_cgroup(memcg)));
 }
        if (!gfpflags_allow_blocking(gfp_mask))
                goto nomem;
 
-       mem_cgroup_event(mem_over_limit, MEMCG_MAX);
+       memcg_memory_event(mem_over_limit, MEMCG_MAX);
 
        nr_reclaimed = try_to_free_mem_cgroup_pages(mem_over_limit, nr_pages,
                                                    gfp_mask, may_swap);
        if (fatal_signal_pending(current))
                goto force;
 
-       mem_cgroup_event(mem_over_limit, MEMCG_OOM);
+       memcg_memory_event(mem_over_limit, MEMCG_OOM);
 
        mem_cgroup_oom(mem_over_limit, gfp_mask,
                       get_order(nr_pages * PAGE_SIZE));
        struct mem_cgroup *iter;
        int i;
 
-       memset(events, 0, sizeof(*events) * MEMCG_NR_EVENTS);
+       memset(events, 0, sizeof(*events) * NR_VM_EVENT_ITEMS);
 
        for_each_mem_cgroup_tree(iter, memcg) {
-               for (i = 0; i < MEMCG_NR_EVENTS; i++)
+               for (i = 0; i < NR_VM_EVENT_ITEMS; i++)
                        events[i] += memcg_sum_events(iter, i);
        }
 }
                        continue;
                }
 
-               mem_cgroup_event(memcg, MEMCG_OOM);
+               memcg_memory_event(memcg, MEMCG_OOM);
                if (!mem_cgroup_out_of_memory(memcg, GFP_KERNEL, 0))
                        break;
        }
 {
        struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m));
 
-       seq_printf(m, "low %lu\n", memcg_sum_events(memcg, MEMCG_LOW));
-       seq_printf(m, "high %lu\n", memcg_sum_events(memcg, MEMCG_HIGH));
-       seq_printf(m, "max %lu\n", memcg_sum_events(memcg, MEMCG_MAX));
-       seq_printf(m, "oom %lu\n", memcg_sum_events(memcg, MEMCG_OOM));
+       seq_printf(m, "low %lu\n",
+                  atomic_long_read(&memcg->memory_events[MEMCG_LOW]));
+       seq_printf(m, "high %lu\n",
+                  atomic_long_read(&memcg->memory_events[MEMCG_HIGH]));
+       seq_printf(m, "max %lu\n",
+                  atomic_long_read(&memcg->memory_events[MEMCG_MAX]));
+       seq_printf(m, "oom %lu\n",
+                  atomic_long_read(&memcg->memory_events[MEMCG_OOM]));
        seq_printf(m, "oom_kill %lu\n", memcg_sum_events(memcg, OOM_KILL));
 
        return 0;
 {
        struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m));
        unsigned long stat[MEMCG_NR_STAT];
-       unsigned long events[MEMCG_NR_EVENTS];
+       unsigned long events[NR_VM_EVENT_ITEMS];
        int i;
 
        /*