NR_TLB_LOCAL_FLUSH_ALL,
                NR_TLB_LOCAL_FLUSH_ONE,
 #endif /* CONFIG_DEBUG_TLBFLUSH */
+#ifdef CONFIG_DEBUG_VM_VMACACHE
+               VMACACHE_FIND_CALLS,
+               VMACACHE_FIND_HITS,
+#endif
                NR_VM_EVENT_ITEMS
 };
 
 
 #define count_vm_tlb_events(x, y) do { (void)(y); } while (0)
 #endif
 
+#ifdef CONFIG_DEBUG_VM_VMACACHE
+#define count_vm_vmacache_event(x) count_vm_event(x)
+#else
+#define count_vm_vmacache_event(x) do {} while (0)
+#endif
+
 #define __count_zone_vm_events(item, zone, delta) \
                __count_vm_events(item##_NORMAL - ZONE_NORMAL + \
                zone_idx(zone), delta)
 
 
          If unsure, say N.
 
+config DEBUG_VM_VMACACHE
+       bool "Debug VMA caching"
+       depends on DEBUG_VM
+       help
+         Enable this to turn on VMA caching debug information. Doing so
+         can cause significant overhead, so only enable it in non-production
+         environments.
+
+         If unsure, say N.
+
 config DEBUG_VM_RB
        bool "Debug VM red-black trees"
        depends on DEBUG_VM
 
        if (!vmacache_valid(mm))
                return NULL;
 
+       count_vm_vmacache_event(VMACACHE_FIND_CALLS);
+
        for (i = 0; i < VMACACHE_SIZE; i++) {
                struct vm_area_struct *vma = current->vmacache[i];
 
                        continue;
                if (WARN_ON_ONCE(vma->vm_mm != mm))
                        break;
-               if (vma->vm_start <= addr && vma->vm_end > addr)
+               if (vma->vm_start <= addr && vma->vm_end > addr) {
+                       count_vm_vmacache_event(VMACACHE_FIND_HITS);
                        return vma;
+               }
        }
 
        return NULL;
        if (!vmacache_valid(mm))
                return NULL;
 
+       count_vm_vmacache_event(VMACACHE_FIND_CALLS);
+
        for (i = 0; i < VMACACHE_SIZE; i++) {
                struct vm_area_struct *vma = current->vmacache[i];
 
-               if (vma && vma->vm_start == start && vma->vm_end == end)
+               if (vma && vma->vm_start == start && vma->vm_end == end) {
+                       count_vm_vmacache_event(VMACACHE_FIND_HITS);
                        return vma;
+               }
        }
 
        return NULL;
 
        "nr_tlb_local_flush_one",
 #endif /* CONFIG_DEBUG_TLBFLUSH */
 
+#ifdef CONFIG_DEBUG_VM_VMACACHE
+       "vmacache_find_calls",
+       "vmacache_find_hits",
+#endif
 #endif /* CONFIG_VM_EVENTS_COUNTERS */
 };
 #endif /* CONFIG_PROC_FS || CONFIG_SYSFS || CONFIG_NUMA */