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);

}
原文地址:https://www.cnblogs.com/aspirs/p/15800829.html