aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lameter <cl@linux.com>2011-01-10 11:15:15 -0500
committerPekka Enberg <penberg@kernel.org>2011-01-11 10:09:53 -0500
commit04d94879c8a4973b5499dc26b9d38acee8928791 (patch)
treef6220743a65a2ac24b783884593460cb0467ecc7
parent925268a06dc2b1ff7bfcc37419a6827a0e739639 (diff)
slub: Avoid use of slub_lock in show_slab_objects()
The purpose of the locking is to prevent removal and additions of nodes when statistics are gathered for a slab cache. So we need to avoid racing with memory hotplug functionality. It is enough to take the memory hotplug locks there instead of the slub_lock. online_pages() currently does not acquire the memory_hotplug lock. Another patch will be submitted by the memory hotplug authors to take the memory hotplug lock and describe the uses of the memory hotplug lock to protect against adding and removal of nodes from non hotplug data structures. Cc: <stable@kernel.org> # 2.6.37 Reported-and-tested-by: Bart Van Assche <bvanassche@acm.org> Acked-by: David Rientjes <rientjes@google.com> Signed-off-by: Christoph Lameter <cl@linux.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--mm/slub.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/mm/slub.c b/mm/slub.c
index bec0e355fbad..96e690717822 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3821,7 +3821,7 @@ static ssize_t show_slab_objects(struct kmem_cache *s,
3821 } 3821 }
3822 } 3822 }
3823 3823
3824 down_read(&slub_lock); 3824 lock_memory_hotplug();
3825#ifdef CONFIG_SLUB_DEBUG 3825#ifdef CONFIG_SLUB_DEBUG
3826 if (flags & SO_ALL) { 3826 if (flags & SO_ALL) {
3827 for_each_node_state(node, N_NORMAL_MEMORY) { 3827 for_each_node_state(node, N_NORMAL_MEMORY) {
@@ -3862,7 +3862,7 @@ static ssize_t show_slab_objects(struct kmem_cache *s,
3862 x += sprintf(buf + x, " N%d=%lu", 3862 x += sprintf(buf + x, " N%d=%lu",
3863 node, nodes[node]); 3863 node, nodes[node]);
3864#endif 3864#endif
3865 up_read(&slub_lock); 3865 unlock_memory_hotplug();
3866 kfree(nodes); 3866 kfree(nodes);
3867 return x + sprintf(buf + x, "\n"); 3867 return x + sprintf(buf + x, "\n");
3868} 3868}