|
@@ -390,8 +390,9 @@ static long vma_compute_subtree_gap(struct vm_area_struct *vma)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_DEBUG_VM_RB
|
|
|
-static int browse_rb(struct rb_root *root)
|
|
|
+static int browse_rb(struct mm_struct *mm)
|
|
|
{
|
|
|
+ struct rb_root *root = &mm->mm_rb;
|
|
|
int i = 0, j, bug = 0;
|
|
|
struct rb_node *nd, *pn = NULL;
|
|
|
unsigned long prev = 0, pend = 0;
|
|
@@ -414,12 +415,14 @@ static int browse_rb(struct rb_root *root)
|
|
|
vma->vm_start, vma->vm_end);
|
|
|
bug = 1;
|
|
|
}
|
|
|
+ spin_lock(&mm->page_table_lock);
|
|
|
if (vma->rb_subtree_gap != vma_compute_subtree_gap(vma)) {
|
|
|
pr_emerg("free gap %lx, correct %lx\n",
|
|
|
vma->rb_subtree_gap,
|
|
|
vma_compute_subtree_gap(vma));
|
|
|
bug = 1;
|
|
|
}
|
|
|
+ spin_unlock(&mm->page_table_lock);
|
|
|
i++;
|
|
|
pn = nd;
|
|
|
prev = vma->vm_start;
|
|
@@ -475,7 +478,7 @@ static void validate_mm(struct mm_struct *mm)
|
|
|
mm->highest_vm_end, highest_address);
|
|
|
bug = 1;
|
|
|
}
|
|
|
- i = browse_rb(&mm->mm_rb);
|
|
|
+ i = browse_rb(mm);
|
|
|
if (i != mm->map_count) {
|
|
|
if (i != -1)
|
|
|
pr_emerg("map_count %d rb %d\n", mm->map_count, i);
|