mm,vmacache: add debug data
Introduce a CONFIG_DEBUG_VM_VMACACHE option to enable counting the cache hit rate -- exported in /proc/vmstat. Any updates to the caching scheme needs this kind of data, thus it can save some work re-implementing the counting all the time. Signed-off-by: Davidlohr Bueso <davidlohr@hp.com> Cc: Aswin Chandramouleeswaran <aswin@hp.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
6f04f48dc9
commit
4f115147ff
|
@ -80,6 +80,10 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
|
|||
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
|
||||
};
|
||||
|
||||
|
|
|
@ -95,6 +95,12 @@ static inline void vm_events_fold_cpu(int cpu)
|
|||
#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)
|
||||
|
|
|
@ -501,6 +501,16 @@ config DEBUG_VM
|
|||
|
||||
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
|
||||
|
|
|
@ -78,6 +78,8 @@ struct vm_area_struct *vmacache_find(struct mm_struct *mm, unsigned long addr)
|
|||
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];
|
||||
|
||||
|
@ -85,8 +87,10 @@ struct vm_area_struct *vmacache_find(struct mm_struct *mm, unsigned long addr)
|
|||
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;
|
||||
|
@ -102,11 +106,15 @@ struct vm_area_struct *vmacache_find_exact(struct mm_struct *mm,
|
|||
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;
|
||||
|
|
|
@ -866,6 +866,10 @@ const char * const vmstat_text[] = {
|
|||
"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 */
|
||||
|
|
Loading…
Reference in New Issue