aboutsummaryrefslogtreecommitdiffstats
path: root/mm/vmacache.c
diff options
context:
space:
mode:
authorDavidlohr Bueso <davidlohr@hp.com>2014-06-04 19:06:46 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-04 19:53:57 -0400
commit4f115147ff802267d0aa41e361c5aa5bd933d896 (patch)
tree27afdf3f60c21fde601df63d9e9998b0c758a3fe /mm/vmacache.c
parent6f04f48dc9c0433e2bb687f5f7f7af1aba97b04d (diff)
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>
Diffstat (limited to 'mm/vmacache.c')
-rw-r--r--mm/vmacache.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/mm/vmacache.c b/mm/vmacache.c
index 1037a3bab505..658ed3b3e38d 100644
--- a/mm/vmacache.c
+++ b/mm/vmacache.c
@@ -78,6 +78,8 @@ struct vm_area_struct *vmacache_find(struct mm_struct *mm, unsigned long addr)
78 if (!vmacache_valid(mm)) 78 if (!vmacache_valid(mm))
79 return NULL; 79 return NULL;
80 80
81 count_vm_vmacache_event(VMACACHE_FIND_CALLS);
82
81 for (i = 0; i < VMACACHE_SIZE; i++) { 83 for (i = 0; i < VMACACHE_SIZE; i++) {
82 struct vm_area_struct *vma = current->vmacache[i]; 84 struct vm_area_struct *vma = current->vmacache[i];
83 85
@@ -85,8 +87,10 @@ struct vm_area_struct *vmacache_find(struct mm_struct *mm, unsigned long addr)
85 continue; 87 continue;
86 if (WARN_ON_ONCE(vma->vm_mm != mm)) 88 if (WARN_ON_ONCE(vma->vm_mm != mm))
87 break; 89 break;
88 if (vma->vm_start <= addr && vma->vm_end > addr) 90 if (vma->vm_start <= addr && vma->vm_end > addr) {
91 count_vm_vmacache_event(VMACACHE_FIND_HITS);
89 return vma; 92 return vma;
93 }
90 } 94 }
91 95
92 return NULL; 96 return NULL;
@@ -102,11 +106,15 @@ struct vm_area_struct *vmacache_find_exact(struct mm_struct *mm,
102 if (!vmacache_valid(mm)) 106 if (!vmacache_valid(mm))
103 return NULL; 107 return NULL;
104 108
109 count_vm_vmacache_event(VMACACHE_FIND_CALLS);
110
105 for (i = 0; i < VMACACHE_SIZE; i++) { 111 for (i = 0; i < VMACACHE_SIZE; i++) {
106 struct vm_area_struct *vma = current->vmacache[i]; 112 struct vm_area_struct *vma = current->vmacache[i];
107 113
108 if (vma && vma->vm_start == start && vma->vm_end == end) 114 if (vma && vma->vm_start == start && vma->vm_end == end) {
115 count_vm_vmacache_event(VMACACHE_FIND_HITS);
109 return vma; 116 return vma;
117 }
110 } 118 }
111 119
112 return NULL; 120 return NULL;