zoukankan      html  css  js  c++  java
  • 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);
    
    }
  • 相关阅读:
    juniper ALARM亮红灯
    笔记本设置wifi热点
    基于apache+php+mysql 编译安装详解(转载)
    CentOS6.X 安装MySQL 5.X
    spring 多数据源切换
    Java Reflection(十二):动态类加载与重载
    Java Reflection(十一):动态代理
    Java Reflection(十):数组
    Java Reflection(九):泛型
    Java Reflection(八):注解
  • 原文地址:https://www.cnblogs.com/aspirs/p/15800829.html
Copyright © 2011-2022 走看看