- 论坛徽章:
- 0
|
又回想起这个问题...... 属于同一个page下的object, 可能被cache到不同CPU的kmem_cache_cpu.
现在想来, 这样貌似也是合理的.
首先, 初始状态下, page加入到slub之后, 属于该page的object都是空闲的, 都存在于page->freelist中;
然后, 这个page可能被某个CPU的kmem_cache_cpu所cache, 假设是CPU-0, 那么这个kmem_cache_cpu将得到属于该page的所有object. page->freelist将为空;
接下来, 这个page的一部分object可能在这个CPU-0上被分配出去;
再接着, 可能由于NUMA的node id不匹配, 这个page被deactivate, 脱离了CPU-0. 这时page->freelist将保存着那些未被分配出去的object(其他的object已经在CPU-0上被分配出去了);
这时, 属于page的一部分object正在CPU-0上被使用着, 另一部分object存在于page->freelist中.
那么, 现在就有两个选择:
1, 这个page不放回到partial list, 阻止其他CPU使用这个page;
2, 将这个page放回partial list, 允许其他CPU使用这个page;
对于第一种做法, 可以避免属于同一个page的object被cache到不同CPU. 但是这个page必须等到CPU-0再次cache它以后才能被继续使用; 或者等待CPU-0所使用的属于这个page的object都全部释放, 然后这个page才能被放回partial list或者直接被释放掉.
这样一来, 一个page尽管有空闲的object, 却可能在一定时间内处于不可用状态(极端情况是永远不可用). 这样实现的系统似乎不太可控...
而现在的slub选择了第二种做法, 将page放回partial list. 于是page马上就能被其他CPU使用起来. 那么也就不得不面临属于同一个page的object被cache到不同CPU的问题. 这也是没办法的事情... |
|