void kmem_cache_free(struct kmem_cache *cachep, void *objp)用于释放kmem_cache_alloc 申请的内存。
其源码分析如下:
void kmem_cache_free(struct kmem_cache *cachep, void *objp)
{
unsigned long flags;
#这个函数主要是检查这个slab 是否合法
cachep = cache_from_obj(cachep, objp);
if (!cachep)
return;
#释放mem的时候,会禁止当前cpu的irq
local_irq_save(flags);
debug_check_no_locks_freed(objp, cachep->object_size);
if (!(cachep->flags & SLAB_DEBUG_OBJECTS))
debug_check_no_obj_freed(objp, cachep->object_size);
#释放mem
__cache_free(cachep, objp, _RET_IP_);
local_irq_restore(flags);
trace_kmem_cache_free(_RET_IP_, objp);
}
static inline struct kmem_cache *cache_from_obj(struct kmem_cache *s, void *x)
{
struct kmem_cache *cachep;
struct page *page;
/*
* When kmemcg is not being used, both assignments should return the
* same value. but we don't want to pay the assignment price in that
* case. If it is not compiled in, the compiler should be smart enough
* to not do even the assignment. In that case, slab_equal_or_root
* will also be a constant.
*/
#这里会判断#if defined(CONFIG_MEMCG) && !defined(CONFIG_SLOB) 这个条件是否成立
#在我的系统这个条件是成立的,所以下面这个if条件不会成立
if (!memcg_kmem_enabled() &&
!unlikely(s->flags & SLAB_CONSISTENCY_CHECKS))
return s;
#根据形参x 得到这个slab 所在的page
page = virt_to_head_page(x);
#根据page得到slab_cache
cachep = page->slab_cache;
#这里会比较由形参x得到的slab的指针和形参s表示的slab 是否相等,如果不相等,返回形参s的slab来释放
#如果相等的话,则释放由形参x得到的slab指针。相等的时候返回谁,其实无所谓了,反正都相等嘛
if (slab_equal_or_root(cachep, s))
return cachep;
pr_err("%s: Wrong slab cache. %s but object is from %s\n",
__func__, s->name, cachep->name);
WARN_ON_ONCE(1);
return s;
}
内存管理API之kmem_cache_free
最新推荐文章于 2022-05-26 10:52:33 发布