内存管理API之kmem_cache_free

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值