最近看情景分析,说到kswapd中的kmem_cache_reap()会定期的回收空闲slab。但是在看2.6.11版本源码的时候发现没有对应的函数。在2.6.11源码找到一个应该是替代的函数cache_reap(),所以看了一下。
下面是源码。
static void cache_reap(void *unused)
{
struct list_head *walk;
/**
* 尝试获得cache_chain_sem信号量,该信号量保护slab高速缓存描述符链表。
*/
if (down_trylock(&cache_chain_sem)) {
/* Give up. Setup the next iteration. */
/**
* 如果获取不成功,就调用schedule_delayed_work去调度该函数的下一次执行。
*/
schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC + smp_processor_id());
return;
}
/**
* 扫描cache_chain中的kmem_cache_t描述符。
*/
list_for_each(walk, &cache_chain) {
kmem_cache_t *searchp;
struct list_head* p;
int tofree;
struct slab *slabp;
searchp = list_entry(walk, kmem_cache_t, next);
struct list_head *walk;
/**
* 尝试获得cache_chain_sem信号量,该信号量保护slab高速缓存描述符链表。
*/
if (down_trylock(&cache_chain_sem)) {
/* Gi