embeddedlwp 发表于 2011-09-21 08:40

再次拜读!

kouu 发表于 2011-09-21 10:07

回复kouu
    如果没有配置CONFIG_NUMA,这个条件不会被满足 ...
seekhunter 发表于 2011-09-21 05:50 http://bbs.chinaunix.net/images/common/back.gif

是呀,如果这个条件不满足,那这篇帖子讨论的问题不就不存在了吗?
既然在讨论这个问题,不就是假定条件满足么?


另外,当CPU2 free object的时候(object属于pageXXX), 而pageXXX恰好被CPU1使用,那么object是直接被挂接到page->freelist.
(这前后会用localirq和spinlock保护)。
我看的是3.0的代码,在slab_free和__slab_free里。

是呀,LZ一开始说的不就是这么个场景么?

oscarvei 发表于 2011-09-21 10:54

回复 1# lin_style


    3.如果不是,释放到邻居节点

楼主给点详细的说明? “邻居节点“

unbutun 发表于 2011-09-21 20:09

回复 1# lin_style


    我没看明白,这位哥们的问题,大家帮着解释解释吧

是想说一个cpu上的obj会被释放到另一个cpu上吗,每个obj都是释放到其所在的page上的

我真是没看懂这个问题

qiuxishi 发表于 2016-01-10 01:31

mark,我也发现了这个问题,还以为代码有问题。。。

qiuxishi 发表于 2016-01-10 22:37

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;
        }
页: 1 [2]
查看完整版本: 置疑: 我觉得在linux的slub分配器中,一个内存缓存的BUG