path: root/mm/slob.c
diff options
authorVladimir Davydov <>2014-06-04 16:07:20 -0700
committerLinus Torvalds <>2014-06-04 16:53:59 -0700
commit03afc0e25f7fc03537014a770f4c54ebbe63a24c (patch)
tree520cdb32e6d35cd5b4e61fc5254a151fb03fc24a /mm/slob.c
parentbfc8c90139ebd049b9801a951db3b9a4a00bed9c (diff)
slab: get_online_mems for kmem_cache_{create,destroy,shrink}
When we create a sl[au]b cache, we allocate kmem_cache_node structures for each online NUMA node. To handle nodes taken online/offline, we register memory hotplug notifier and allocate/free kmem_cache_node corresponding to the node that changes its state for each kmem cache. To synchronize between the two paths we hold the slab_mutex during both the cache creationg/destruction path and while tuning per-node parts of kmem caches in memory hotplug handler, but that's not quite right, because it does not guarantee that a newly created cache will have all kmem_cache_nodes initialized in case it races with memory hotplug. For instance, in case of slub: CPU0 CPU1 ---- ---- kmem_cache_create: online_pages: __kmem_cache_create: slab_memory_callback: slab_mem_going_online_callback: lock slab_mutex for each slab_caches list entry allocate kmem_cache node unlock slab_mutex lock slab_mutex init_kmem_cache_nodes: for_each_node_state(node, N_NORMAL_MEMORY) allocate kmem_cache node add kmem_cache to slab_caches list unlock slab_mutex online_pages (continued): node_states_set_node As a result we'll get a kmem cache with not all kmem_cache_nodes allocated. To avoid issues like that we should hold get/put_online_mems() during the whole kmem cache creation/destruction/shrink paths, just like we deal with cpu hotplug. This patch does the trick. Note, that after it's applied, there is no need in taking the slab_mutex for kmem_cache_shrink any more, so it is removed from there. Signed-off-by: Vladimir Davydov <> Cc: Christoph Lameter <> Cc: Pekka Enberg <> Cc: Tang Chen <> Cc: Zhang Yanfei <> Cc: Toshi Kani <> Cc: Xishi Qiu <> Cc: Jiang Liu <> Cc: Rafael J. Wysocki <> Cc: David Rientjes <> Cc: Wen Congyang <> Cc: Yasuaki Ishimatsu <> Cc: Lai Jiangshan <> Signed-off-by: Andrew Morton <> Signed-off-by: Linus Torvalds <>
Diffstat (limited to 'mm/slob.c')
1 files changed, 1 insertions, 2 deletions
diff --git a/mm/slob.c b/mm/slob.c
index 730cad45d4be..21980e0f39a8 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -620,11 +620,10 @@ int __kmem_cache_shutdown(struct kmem_cache *c)
return 0;
-int kmem_cache_shrink(struct kmem_cache *d)
+int __kmem_cache_shrink(struct kmem_cache *d)
return 0;
struct kmem_cache kmem_cache_boot = {
.name = "kmem_cache",