interval tree
interval tree
interval tree中可以插入完全相同的node,此后interval tree中将会有此两个相同的node
往interval tree中插入两个相同的node后,再根据node的值到interval tree中去搜索,结果是可以找到这两个相同的node,这两个node的rb_subtree_last的值不同,其中第一个搜索出来的node的rb_subtree_last的值是0x20f,这个是根据此node(anon_avc_chain)本身算出来的;而第二个搜索出来的node的rb_subtree_last的值不是由它本身计算出来的,这个0xb0f是此棵interval tree最大的rb_subtree_last值:
[ 98.655755] cnt:1: avc->rb_subtree_last: 0x20f, avc->vma->vm_start/vm_end: 0x200000, 0x210000.
[ 98.677732] cnt:2: avc->rb_subtree_last: 0xb0f, avc->vma->vm_start/vm_end: 0x200000, 0x210000.
void interval_tree_test_func(void) { int i; int cnt = 0; pgoff_t pgoff_start, pgoff_end; struct rb_root_cached rb_root; struct anon_vma_chain *avcs; struct vm_area_struct *vmas; struct anon_vma anon_vma; struct anon_vma_chain *avc; pgoff_start = pgoff_end = 0x200000 >> PAGE_SHIFT; anon_vma.rb_root = RB_ROOT_CACHED; avcs = (struct anon_vma_chain *)kmalloc(sizeof(struct anon_vma_chain)*12, GFP_KERNEL); if(avcs == NULL) { pr_err("alloc avcs failed.\n"); return; } vmas = (struct vm_area_struct *)kmalloc(sizeof(struct vm_area_struct)*12, GFP_KERNEL); if(vmas == NULL) { pr_err("alloc vmas failed.\n"); return; } for(i = 0; i < 12; i++) { vmas[i].vm_start = i*0x100000; vmas[i].vm_end = vmas[i].vm_start + 16*PAGE_SIZE; vmas[i].vm_pgoff = vmas[i].vm_start>>PAGE_SHIFT; } vmas[3].vm_start = vmas[2].vm_start; vmas[3].vm_end = vmas[2].vm_end; vmas[3].vm_pgoff = vmas[2].vm_pgoff; for(i = 0; i<12; i++) { avcs[i].anon_vma = &anon_vma; avcs[i].vma = &vmas[i]; anon_vma_interval_tree_insert(&avcs[i], &anon_vma.rb_root); } anon_vma_interval_tree_foreach(avc,&anon_vma.rb_root,pgoff_start,pgoff_end) { pr_info("cnt:%d: avc->rb_subtree_last: %#lx, avc->vma->vm_start/vm_end: %#lx, %#lx.\n", ++cnt, avc->rb_subtree_last, avc->vma->vm_start, avc->vma->vm_end); } kfree(avcs); kfree(vmas); }