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);
    
    }
  • 相关阅读:
    尬聊攻略丨过年回家,你最怕被亲戚问什么?
    有人被盗刷900次? 支付宝发布年终“神反转”盘点
    470余万条疑似12306用户数据遭贩卖 嫌疑人被刑拘
    利用Python实现对Web服务器的目录探测
    栈空间溢出
    KB奇遇记(6):搞笑的ERP项目团队
    探寻不同版本号的SDK对iOS程序的影响
    阅读《Android 从入门到精通》(24)——切换图片
    leetcode
    Grunt的配置及使用(压缩合并js/css)
  • 原文地址:https://www.cnblogs.com/aspirs/p/15800829.html
Copyright © 2011-2022 走看看