|
@@ -1639,33 +1639,34 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
|
|
{
|
|
{
|
|
struct vm_area_struct *vma = NULL;
|
|
struct vm_area_struct *vma = NULL;
|
|
|
|
|
|
- if (mm) {
|
|
|
|
- /* Check the cache first. */
|
|
|
|
- /* (Cache hit rate is typically around 35%.) */
|
|
|
|
- vma = mm->mmap_cache;
|
|
|
|
- if (!(vma && vma->vm_end > addr && vma->vm_start <= addr)) {
|
|
|
|
- struct rb_node * rb_node;
|
|
|
|
-
|
|
|
|
- rb_node = mm->mm_rb.rb_node;
|
|
|
|
- vma = NULL;
|
|
|
|
-
|
|
|
|
- while (rb_node) {
|
|
|
|
- struct vm_area_struct * vma_tmp;
|
|
|
|
-
|
|
|
|
- vma_tmp = rb_entry(rb_node,
|
|
|
|
- struct vm_area_struct, vm_rb);
|
|
|
|
-
|
|
|
|
- if (vma_tmp->vm_end > addr) {
|
|
|
|
- vma = vma_tmp;
|
|
|
|
- if (vma_tmp->vm_start <= addr)
|
|
|
|
- break;
|
|
|
|
- rb_node = rb_node->rb_left;
|
|
|
|
- } else
|
|
|
|
- rb_node = rb_node->rb_right;
|
|
|
|
- }
|
|
|
|
- if (vma)
|
|
|
|
- mm->mmap_cache = vma;
|
|
|
|
|
|
+ if (WARN_ON_ONCE(!mm)) /* Remove this in linux-3.6 */
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ /* Check the cache first. */
|
|
|
|
+ /* (Cache hit rate is typically around 35%.) */
|
|
|
|
+ vma = mm->mmap_cache;
|
|
|
|
+ if (!(vma && vma->vm_end > addr && vma->vm_start <= addr)) {
|
|
|
|
+ struct rb_node *rb_node;
|
|
|
|
+
|
|
|
|
+ rb_node = mm->mm_rb.rb_node;
|
|
|
|
+ vma = NULL;
|
|
|
|
+
|
|
|
|
+ while (rb_node) {
|
|
|
|
+ struct vm_area_struct *vma_tmp;
|
|
|
|
+
|
|
|
|
+ vma_tmp = rb_entry(rb_node,
|
|
|
|
+ struct vm_area_struct, vm_rb);
|
|
|
|
+
|
|
|
|
+ if (vma_tmp->vm_end > addr) {
|
|
|
|
+ vma = vma_tmp;
|
|
|
|
+ if (vma_tmp->vm_start <= addr)
|
|
|
|
+ break;
|
|
|
|
+ rb_node = rb_node->rb_left;
|
|
|
|
+ } else
|
|
|
|
+ rb_node = rb_node->rb_right;
|
|
}
|
|
}
|
|
|
|
+ if (vma)
|
|
|
|
+ mm->mmap_cache = vma;
|
|
}
|
|
}
|
|
return vma;
|
|
return vma;
|
|
}
|
|
}
|