在per-CPU缓存中没有对象时,工作负荷会加重。该情形下所需的重新填充操作由cache_alloc_refill实现,在per-CPU缓存无法直接满足分配请求时,则调用该函数。 内核现在必须找到array_cache->batchcount个未使用对象重新填充per-CPU缓存。首先扫描所有部分空闲slab的链表(slabs_partial),然后通过slab_get_obj依次获取所有的...
3313 slab_post_alloc_hook(cachep, objcg, flags, 1, &objp); 3314 return objp; 3315 } ___cache_alloc ___cache_alloc 是 Slab 分配 Obj 的核心函数。 1. 首先访问 array_cache,查看是否有空闲 Obj,如果存在的就返回,否则; 1. 调用 cache_alloc_refill 从 kmem_cache_node 转移一部分空闲 Obj ...
STATS_INC_ALLOCHIT(cachep); ac->touched = 1; objp = ac->entry[--ac->avail]; } else { // 否则新分配cache单元 STATS_INC_ALLOCMISS(cachep); objp = cache_alloc_refill(cachep, flags); } return objp; } // 分配cache单元 static void *cache_alloc_refill(struct kmem_cache *cachep, ...
与某kmem_cache相应的array_cache还未建立,|因此将执行else分支.|--}|--else|--{| objp =cache_alloc_refill(cachep, flags);|填充每CPU的array_cache,并获得相应类型的kmem_cache实例空间起始地址.|--}|
static inline struct task_struct *alloc_task_struct_node(int node) { return kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node); } 内核中通过kmem_cache_alloc_node 函数要求 slab cache 从指定的 NUMA 节点中分配对象。 // 定义在文件:/mm/slub.c ...
内核中通过 kmem_cache_alloc_node 函数要求 slab cache 从指定的 NUMA 节点中分配对象。 // 定义在文件:/mm/slub.c void *kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node) { void *ret = slab_alloc_node(s, gfpflags, node, _RET_IP_); ...
freelist){// 此时 cpu 本地缓存的 slub 里的空闲对象已经全部耗尽// slub 从 cpu 本地缓存中脱离,进入 new_slab 分支走慢速分配路径c->page=NULL;stat(s,DEACTIVATE_BYPASS);gotonew_slab;}stat(s,ALLOC_REFILL);load_freelist:// 被 slab cache 的 cpu 本地缓存的 slub 所属的 page 必须是 frozen...
freelist){// 此时 cpu 本地缓存的 slub 里的空闲对象已经全部耗尽// slub 从 cpu 本地缓存中脱离,进入 new_slab 分支走慢速分配路径c->page=NULL;stat(s,DEACTIVATE_BYPASS);gotonew_slab;}stat(s,ALLOC_REFILL);load_freelist:// 被 slab cache 的 cpu 本地缓存的 slub 所属的 page 必须是 frozen...
freelist){// 此时 cpu 本地缓存的 slub 里的空闲对象已经全部耗尽// slub 从 cpu 本地缓存中脱离,进入 new_slab 分支走慢速分配路径c->page=NULL;stat(s,DEACTIVATE_BYPASS);goto new_slab;}stat(s,ALLOC_REFILL);load_freelist:// 被 slab cache 的 cpu 本地缓存的 slub 所属的 page 必须是 ...
当你调用kmem_cache_alloc()时候它只是从slab cache中找一个之前已经分配好的,空闲的小块的地址返回给...