您的位置:首页 > 其它

内存管理API之kmem_cache_alloc

2018-01-24 08:15 1061 查看
void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)用于从缓存中申请内存。
其使用的例程如下:
table->table = kmem_cache_alloc(amd_iommu_irq_cache, GFP_ATOMIC);
if (!table->table) {
kfree(table);
table = NULL;
goto out_unlock;
}
其源码分析如下:

void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
{
#核心是调用slab_alloc 来申请
void *ret = slab_alloc(cachep, flags, _RET_IP_);
#下面这两个函数是debug 用的
kasan_slab_alloc(cachep, ret, flags);
trace_kmem_cache_alloc(_RET_IP_, ret,
cachep->object_size, cachep->size, flags);

return ret;
}
其中slab_alloc 在slab/slub/slob 中都有实现,我们这里以slab中的实现为例:
static __always_inline void *
slab_alloc(struct kmem_cache *cachep, gfp_t flags, unsigned long caller)
{
unsigned long save_flags;
void *objp;

flags &= gfp_allowed_mask;
#这个函数和后面的slab_post_alloc_hook 配合使用
cachep = slab_pre_alloc_hook(cachep, flags);
if (unlikely(!cachep))
return NULL;

cache_alloc_debugcheck_before(cachep, flags);
#关闭本地cpu的中断
local_irq_save(save_flags);
#开始从名字为cachep的缓存中申请内存
objp = __do_cache_alloc(cachep, flags);
local_irq_restore(save_flags);
objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller);
prefetchw(objp);

if (unlikely(flags & __GFP_ZERO) && objp)
memset(objp, 0, cachep->object_size);

slab_post_alloc_hook(cachep, flags, 1, &objp);
return objp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: