aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-05-30 15:46:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-05-30 15:46:17 -0400
commit3b03117c5cfbb04175b688c79ea4155b8ef812d3 (patch)
tree5d2e3d0d7db98e2b47c7bb51be39bc4ced6a4d97 /mm
parentfa7eadab4b4aec0139d2429e6f8d13375ff8a658 (diff)
parent0f1f694260e0d35b5ce7d471f6e679c3dd4d7d94 (diff)
Merge branch 'slub/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6
* 'slub/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6: SLUB: Allow full duplication of kmalloc array for 390 slub: move kmem_cache_node into it's own cacheline
Diffstat (limited to 'mm')
-rw-r--r--mm/slub.c33
1 files changed, 11 insertions, 22 deletions
diff --git a/mm/slub.c b/mm/slub.c
index 26f0cb9cc584..578f68f3c51f 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2137,7 +2137,7 @@ static void free_kmem_cache_nodes(struct kmem_cache *s)
2137 2137
2138 for_each_node_state(node, N_NORMAL_MEMORY) { 2138 for_each_node_state(node, N_NORMAL_MEMORY) {
2139 struct kmem_cache_node *n = s->node[node]; 2139 struct kmem_cache_node *n = s->node[node];
2140 if (n && n != &s->local_node) 2140 if (n)
2141 kmem_cache_free(kmalloc_caches, n); 2141 kmem_cache_free(kmalloc_caches, n);
2142 s->node[node] = NULL; 2142 s->node[node] = NULL;
2143 } 2143 }
@@ -2146,33 +2146,22 @@ static void free_kmem_cache_nodes(struct kmem_cache *s)
2146static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags) 2146static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags)
2147{ 2147{
2148 int node; 2148 int node;
2149 int local_node;
2150
2151 if (slab_state >= UP && (s < kmalloc_caches ||
2152 s >= kmalloc_caches + KMALLOC_CACHES))
2153 local_node = page_to_nid(virt_to_page(s));
2154 else
2155 local_node = 0;
2156 2149
2157 for_each_node_state(node, N_NORMAL_MEMORY) { 2150 for_each_node_state(node, N_NORMAL_MEMORY) {
2158 struct kmem_cache_node *n; 2151 struct kmem_cache_node *n;
2159 2152
2160 if (local_node == node) 2153 if (slab_state == DOWN) {
2161 n = &s->local_node; 2154 early_kmem_cache_node_alloc(gfpflags, node);
2162 else { 2155 continue;
2163 if (slab_state == DOWN) { 2156 }
2164 early_kmem_cache_node_alloc(gfpflags, node); 2157 n = kmem_cache_alloc_node(kmalloc_caches,
2165 continue; 2158 gfpflags, node);
2166 }
2167 n = kmem_cache_alloc_node(kmalloc_caches,
2168 gfpflags, node);
2169
2170 if (!n) {
2171 free_kmem_cache_nodes(s);
2172 return 0;
2173 }
2174 2159
2160 if (!n) {
2161 free_kmem_cache_nodes(s);
2162 return 0;
2175 } 2163 }
2164
2176 s->node[node] = n; 2165 s->node[node] = n;
2177 init_kmem_cache_node(n, s); 2166 init_kmem_cache_node(n, s);
2178 } 2167 }