一、idr构建的结构可以看成是32叉树, 它需要用到2个结构体:

struct idr {
    struct idr_layer __rcu *top;    /*根节点*/
    struct idr_layer *id_free;         /*空闲节点*/
    int          layers;                 /*树的高度*/
    int          id_free_cnt;        /*空闲节点数*/
    spinlock_t      lock;
};

struct idr_layer {
    unsigned long         bitmap;     /*位图*/
    struct idr_layer __rcu    *ary[1<<IDR_BITS];    /*孩子节点或者地址数据*/
    int             count;     /*ary已存放数*/
    int             layer;     /* 相对叶子节点的高度 */
    struct rcu_head         rcu_head;
};

  

  二、idr初始化:

1 #define IDR_INIT(name)      \  
2 {               \  
3     .top        = NULL, \  
4     .id_free        = NULL, \  
5     .layers         = 0,    \  
6     .id_free_cnt    = 0,    \  
7     .lock       = __SPIN_LOCK_UNLOCKED(name.lock),  \  
8 }  
9 #define DEFINE_IDR(name)    struct idr name = IDR_INIT(name)
View Code

相关文章: