内存管理API之mempool_create

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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值