page-cache层

pagecache层内存管理

如果使用page,尤其对于32位系统来说,kmap & kunmap,可以把做struct *page与虚拟地址的映射

用kmap做一个临时的映射,然后通过kunmap释放以使用稀少的高端内存映射

pagecache层中TOWRITE是为了解决livelock的问题

pagecache是怎么做到高效的搜索算法的?

tag标志位很关键!

radix_tree_node的结构体时:

2^6=64 2^4=16,所以一个 radix_tree_node slots 数组一般是 16 长或者 64 长,

struct radix_tree_node {
        unsigned char   shift;  /* Bits remaining in each slot 是说traverl到这里,我已经偏移了几位了,所以在算子地址之前,需要先index >> parent->shift */
        unsigned char   offset; /* Slot offset in parent,位于父目录的哪个slot? */
        unsigned int    count;
        union {
                struct {
                        /* Used when ascending tree */
                        struct radix_tree_node *parent;
                        /* For tree user */
                        void *private_data;
                };
                /* Used when freeing node */
                struct rcu_head rcu_head;
        };
        /* For tree user */
        struct list_head private_list;
        void __rcu      *slots[RADIX_TREE_MAP_SIZE]; /×每个node包含有2^RADIX_TREE_MAP_SHIFT个slots×/
        unsigned long   tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS];
};

 tags数组,说明一个radix_node最多能设置三个tag,再多就不行了!

 第二维是一个bitmap,表示这个对应位上的 bit 是否被设置上了!比如radix

#define RADIX_TREE_MAX_TAGS 3
#ifndef RADIX_TREE_MAP_SHIFT
#define RADIX_TREE_MAP_SHIFT    (CONFIG_BASE_SMALL ? 4 : 6)
#endif
#define RADIX_TREE_MAP_SIZE     (1UL << RADIX_TREE_MAP_SHIFT)
#define RADIX_TREE_MAP_MASK     (RADIX_TREE_MAP_SIZE-1)
#define RADIX_TREE_TAG_LONGS    \
        ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG)
RADIX_TREE_TAG_LOGS 表示

 node_maxindex 函数作用:

     

 

posted @ 2016-01-11 23:10  honpey  阅读(636)  评论(0编辑  收藏  举报