Linux 内核 radix 树 API
  我们从数据结构的初始化开始看,radix 树支持两种方式初始化。
  第一个是使用宏 RADIX_TREE :
  RADIX_TREE(name, gfp_mask);
  正如你看到,只需要提供 name 参数,能够使用 RADIX_TREE 宏完成 radix 的定义以及初始化,RADIX_TREE 宏的实现非常简单:
  #define RADIX_TREE(name, mask)
  struct radix_tree_root name = RADIX_TREE_INIT(mask)
  #define RADIX_TREE_INIT(mask)   {
  .height = 0,
  .gfp_mask = (mask),
  .rnode = NULL,
  }
  RADIX_TREE 宏首先使用 name 定义了一个 radix_tree_root 实例,并用 RADIX_TREE_INIT 宏带参数 mask 进行初始化。宏 RADIX_TREE_INIT 将 radix_tree_root 初始化为默认属性,并将 gfp_mask 初始化为入参 mask 。
  第二种方式是手工定义 radix_tree_root 变量,之后再使用 mask 调用 INIT_RADIX_TREE 宏对变量进行初始化。
  struct radix_tree_root my_radix_tree;
  INIT_RADIX_TREE(my_tree, gfp_mask_for_my_radix_tree);
  INIT_RADIX_TREE 宏定义:
  #define INIT_RADIX_TREE(root, mask)
  do {
  (root)->height = 0;
  (root)->gfp_mask = (mask);
  (root)->rnode = NULL;
  } while (0)
  宏 INIT_RADIX_TREE 所初始化的属性与 RADIX_TREE_INIT 一致
  接下来是 radix 树的节点插入以及删除,这两个函数:
  radix_tree_insert;
  radix_tree_delete.
  第一个函数 radix_tree_insert 需要三个入参:
  radix 树 root 节点结构
  索引关键字
  需要插入存储的数据
  第二个函数 radix_tree_delete 除了不需要存储数据参数外,其他与 radix_tree_insert 一致。
  radix 树的查找实现有以下几个函数:
  radix_tree_lookup;
  radix_tree_gang_lookup;
  radix_tree_lookup_slot;
  第一个函数 radix_tree_lookup 需要两个参数:
  radix 树 root 节点结构
  索引关键字
  这个函数通过给定的关键字查找 radix 树,并返关键字所对应的结点。
  第二个函数 radix_tree_gang_lookup 具有以下特征:
  unsigned int radix_tree_gang_lookup(struct radix_tree_root *root,
  void **results,
  unsigned long first_index,
  unsigned int max_items);
  函数返回查找到记录的条目数,并根据关键字进行排序,返回的总结点数不超过入参 max_items 的大小。
  后一个函数 radix_tree_lookup_slot 返回结点 slot 中所存储的数据。