@@ -325,6 +325,8 @@ EXPORT_SYMBOL(vmalloc_to_pfn);
325
325
326
326
/*** Global kva allocator ***/
327
327
328
+ #define DEBUG_AUGMENT_PROPAGATE_CHECK 0
329
+
328
330
#define VM_LAZY_FREE 0x02
329
331
#define VM_VM_AREA 0x04
330
332
@@ -539,6 +541,48 @@ unlink_va(struct vmap_area *va, struct rb_root *root)
539
541
}
540
542
}
541
543
544
+ #if DEBUG_AUGMENT_PROPAGATE_CHECK
545
+ static void
546
+ augment_tree_propagate_check (struct rb_node * n )
547
+ {
548
+ struct vmap_area * va ;
549
+ struct rb_node * node ;
550
+ unsigned long size ;
551
+ bool found = false;
552
+
553
+ if (n == NULL )
554
+ return ;
555
+
556
+ va = rb_entry (n , struct vmap_area , rb_node );
557
+ size = va -> subtree_max_size ;
558
+ node = n ;
559
+
560
+ while (node ) {
561
+ va = rb_entry (node , struct vmap_area , rb_node );
562
+
563
+ if (get_subtree_max_size (node -> rb_left ) == size ) {
564
+ node = node -> rb_left ;
565
+ } else {
566
+ if (va_size (va ) == size ) {
567
+ found = true;
568
+ break ;
569
+ }
570
+
571
+ node = node -> rb_right ;
572
+ }
573
+ }
574
+
575
+ if (!found ) {
576
+ va = rb_entry (n , struct vmap_area , rb_node );
577
+ pr_emerg ("tree is corrupted: %lu, %lu\n" ,
578
+ va_size (va ), va -> subtree_max_size );
579
+ }
580
+
581
+ augment_tree_propagate_check (n -> rb_left );
582
+ augment_tree_propagate_check (n -> rb_right );
583
+ }
584
+ #endif
585
+
542
586
/*
543
587
* This function populates subtree_max_size from bottom to upper
544
588
* levels starting from VA point. The propagation must be done
@@ -588,6 +632,10 @@ augment_tree_propagate_from(struct vmap_area *va)
588
632
va -> subtree_max_size = new_va_sub_max_size ;
589
633
node = rb_parent (& va -> rb_node );
590
634
}
635
+
636
+ #if DEBUG_AUGMENT_PROPAGATE_CHECK
637
+ augment_tree_propagate_check (free_vmap_area_root .rb_node );
638
+ #endif
591
639
}
592
640
593
641
static void
0 commit comments