mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,mempool_free_t *free_fn, void *pool_data)
函数的功能是新建一个缓存池。
其源码分析如下:
mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,
mempool_free_t *free_fn, void *pool_data)
{
#在形参中添加新建缓存的标志GFP_kernel , 且不指明是在哪个node上.
return mempool_create_node(min_nr,alloc_fn,free_fn, pool_data,
GFP_KERNEL, NUMA_NO_NODE);
}
EXPORT_SYMBOL(mempool_create);
mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn,
mempool_free_t *free_fn, void *pool_data,
gfp_t gfp_mask, int node_id)
{
mempool_t *pool;
#申请保存mempool自身结构的内存
pool = kzalloc_node(sizeof(*pool), gfp_mask, node_id);
if (!pool)
return NULL;
#申请最少min_nr 个byte 保存在缓存中,这样保证及时在内存紧张时至少可以申请min_nr个byte的内存
pool->elements = kmalloc_array_node(min_nr, sizeof(void *),
gfp_mask, node_id);
#如果能保证的最小内存都申请失败,则退出新建的缓存池,从这里也可以看出缓存池必要保证最小的内存输出
if (!pool->elements) {
kfree(pool);
return NULL;
}
#初始化pool中的自旋锁
spin_lock_init(&pool->lock);
#保存最小可以从缓存中申请到的内存
pool->min_nr = min_nr;
pool->pool_data = pool_data;
#初始化等待队列
init_waitqueue_head(&pool->wait);
#分别给从内存池中申请内存和释放内存的指针赋值,可以看到缓存池中最小内存不是由这个函数指针保证的。
pool->alloc = alloc_fn;
pool->free = free_fn;
/*
* First pre-allocate the guaranteed number of buffers.
*/
#除了前面通过kmalloc_array_node 预留内存池最小输出内存外,这里也通过alloc函数申请一份最小的可输出内存
while (pool->curr_nr < pool->min_nr) {
void *element;
element = pool->alloc(gfp_mask, pool->pool_data);
if (unlikely(!element)) {
mempool_destroy(pool);
return NULL;
}
#将通过alloc函数之神申请到的最小内存保存在list中
add_element(pool, element);
}
return pool;
}
内存管理API之mempool_create
最新推荐文章于 2024-11-01 16:35:49 发布