kernel hacker修炼之道之内存管理-SLUB(销毁SLUB高速缓存kmem_cache_destroy())

本文深入探讨了SLUB高速缓存的kmem_cache_destroy()函数如何通过减少引用计数并释放资源来实现高速缓存的销毁过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

销毁SLUB高速缓存kmem_cache_destroy()

作者:李万鹏 于北京 borqs


SLUB分配器调用kmem_cache_destroy()来释放cache。

void kmem_cache_destroy(struct kmem_cache *s)
{
down_write(&slub_lock);
/*减少cache的引用计数*/
s->refcount--;
/*如果cache没有被使用了,比如被复用*/
if (!s->refcount) {
/*从slab_caches链表删除这个cache*/
list_del(&s->list);
/*释放cache占用的资源*/
if (kmem_cache_close(s)) {
printk(KERN_ERR "SLUB %s: %s called for cache that "
"still has objects.\n", s->name, __func__);
dump_stack();
}
if (s->flags & SLAB_DESTROY_BY_RCU)
rcu_barrier();
sysfs_slab_remove(s);
}
up_write(&slub_lock);
}
EXPORT_SYMBOL(kmem_cache_destroy);

static inline int kmem_cache_close(struct kmem_cache *s)
{
int node;
/*将所有的cpu local slab释放回 cache*/
flush_all(s);
free_percpu(s->cpu_slab);
/*循环释放每个节点的slabs_partial*/
for_each_node_state(node, N_NORMAL_MEMORY) {
struct kmem_cache_node *n = get_node(s, node);
free_partial(s, n);
if (n->nr_partial || slabs_node(s, node))
return 1;
}
free_kmem_cache_nodes(s);
return 0;
}

static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n)
{
unsigned long flags;
struct page *page, *h;
spin_lock_irqsave(&n->list_lock, flags);
list_for_each_entry_safe(page, h, &n->partial, lru) {
if (!page->inuse) {
/*减少节点上slab的个数*/
__remove_partial(n, page);
/*销毁slab块*/
discard_slab(s, page);
} else {
list_slab_objects(s, page,
"Objects remaining on kmem_cache_close()");
}
}
spin_unlock_irqrestore(&n->list_lock, flags);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值