- 论坛徽章:
- 2
|
LZ,我又仔细看了代码,你的疑问:“并且在公共的邻居节点中,其他的kmem_cache_cpu很容易就取到”,这个不对!即一个page的obj只可能被一个kmem_cache_cpu使用,释放的obj会存放在page的freelist上,而这个page是不在任何链表的;
page上的obj被一个kmem_cache_cpu获取后,这个page会设置冻结标志,虽然其他cpu释放这个page的obj时会加入到page的freelist中,但不会把这个page加到partial链表中,因此其他cpu没法获取这个page;当原来cpu的obj用完补充时会先考虑这个page在这期间是否有新释放的obj进来,即page的freelist是否为空,若有obj则优先补充,而不是搜寻新的partial;
我看的是2.6.32的内核,这个版本虽然老,但写的比较简洁,我想其他版本的kernel这个原则应该也不会变;
你看__slab_free()中的这个判断
if (unlikely(PageSlubFrozen(page))) {
stat(c, FREE_FROZEN);
goto out_unlock;
} |
|