|
@@ -641,6 +641,26 @@ static void init_node_lock_keys(int q)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void on_slab_lock_classes_node(struct kmem_cache *cachep, int q)
|
|
|
+{
|
|
|
+ struct kmem_list3 *l3;
|
|
|
+ l3 = cachep->nodelists[q];
|
|
|
+ if (!l3)
|
|
|
+ return;
|
|
|
+
|
|
|
+ slab_set_lock_classes(cachep, &on_slab_l3_key,
|
|
|
+ &on_slab_alc_key, q);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void on_slab_lock_classes(struct kmem_cache *cachep)
|
|
|
+{
|
|
|
+ int node;
|
|
|
+
|
|
|
+ VM_BUG_ON(OFF_SLAB(cachep));
|
|
|
+ for_each_node(node)
|
|
|
+ on_slab_lock_classes_node(cachep, node);
|
|
|
+}
|
|
|
+
|
|
|
static inline void init_lock_keys(void)
|
|
|
{
|
|
|
int node;
|
|
@@ -657,6 +677,14 @@ static inline void init_lock_keys(void)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+static inline void on_slab_lock_classes(struct kmem_cache *cachep)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+static inline void on_slab_lock_classes_node(struct kmem_cache *cachep, int node)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
static void slab_set_debugobj_lock_classes_node(struct kmem_cache *cachep, int node)
|
|
|
{
|
|
|
}
|
|
@@ -1385,6 +1413,9 @@ static int __cpuinit cpuup_prepare(long cpu)
|
|
|
free_alien_cache(alien);
|
|
|
if (cachep->flags & SLAB_DEBUG_OBJECTS)
|
|
|
slab_set_debugobj_lock_classes_node(cachep, node);
|
|
|
+ else if (!OFF_SLAB(cachep) &&
|
|
|
+ !(cachep->flags & SLAB_DESTROY_BY_RCU))
|
|
|
+ on_slab_lock_classes_node(cachep, node);
|
|
|
}
|
|
|
init_node_lock_keys(node);
|
|
|
|
|
@@ -2489,7 +2520,8 @@ __kmem_cache_create (struct kmem_cache *cachep, unsigned long flags)
|
|
|
WARN_ON_ONCE(flags & SLAB_DESTROY_BY_RCU);
|
|
|
|
|
|
slab_set_debugobj_lock_classes(cachep);
|
|
|
- }
|
|
|
+ } else if (!OFF_SLAB(cachep) && !(flags & SLAB_DESTROY_BY_RCU))
|
|
|
+ on_slab_lock_classes(cachep);
|
|
|
|
|
|
return 0;
|
|
|
}
|