aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/slub.c66
1 files changed, 36 insertions, 30 deletions
diff --git a/mm/slub.c b/mm/slub.c
index 55b508df62a3..2b50b97a0fc3 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2272,6 +2272,40 @@ panic:
2272 panic("Creation of kmalloc slab %s size=%d failed.\n", name, size); 2272 panic("Creation of kmalloc slab %s size=%d failed.\n", name, size);
2273} 2273}
2274 2274
2275#ifdef CONFIG_ZONE_DMA
2276static noinline struct kmem_cache *dma_kmalloc_cache(int index, gfp_t flags)
2277{
2278 struct kmem_cache *s;
2279 struct kmem_cache *x;
2280 char *text;
2281 size_t realsize;
2282
2283 s = kmalloc_caches_dma[index];
2284 if (s)
2285 return s;
2286
2287 /* Dynamically create dma cache */
2288 x = kmalloc(kmem_size, flags & ~SLUB_DMA);
2289 if (!x)
2290 panic("Unable to allocate memory for dma cache\n");
2291
2292 if (index <= KMALLOC_SHIFT_HIGH)
2293 realsize = 1 << index;
2294 else {
2295 if (index == 1)
2296 realsize = 96;
2297 else
2298 realsize = 192;
2299 }
2300
2301 text = kasprintf(flags & ~SLUB_DMA, "kmalloc_dma-%d",
2302 (unsigned int)realsize);
2303 s = create_kmalloc_cache(x, text, realsize, flags);
2304 kmalloc_caches_dma[index] = s;
2305 return s;
2306}
2307#endif
2308
2275static struct kmem_cache *get_slab(size_t size, gfp_t flags) 2309static struct kmem_cache *get_slab(size_t size, gfp_t flags)
2276{ 2310{
2277 int index = kmalloc_index(size); 2311 int index = kmalloc_index(size);
@@ -2284,36 +2318,8 @@ static struct kmem_cache *get_slab(size_t size, gfp_t flags)
2284 return NULL; 2318 return NULL;
2285 2319
2286#ifdef CONFIG_ZONE_DMA 2320#ifdef CONFIG_ZONE_DMA
2287 if ((flags & SLUB_DMA)) { 2321 if ((flags & SLUB_DMA))
2288 struct kmem_cache *s; 2322 return dma_kmalloc_cache(index, flags);
2289 struct kmem_cache *x;
2290 char *text;
2291 size_t realsize;
2292
2293 s = kmalloc_caches_dma[index];
2294 if (s)
2295 return s;
2296
2297 /* Dynamically create dma cache */
2298 x = kmalloc(kmem_size, flags & ~SLUB_DMA);
2299 if (!x)
2300 panic("Unable to allocate memory for dma cache\n");
2301
2302 if (index <= KMALLOC_SHIFT_HIGH)
2303 realsize = 1 << index;
2304 else {
2305 if (index == 1)
2306 realsize = 96;
2307 else
2308 realsize = 192;
2309 }
2310
2311 text = kasprintf(flags & ~SLUB_DMA, "kmalloc_dma-%d",
2312 (unsigned int)realsize);
2313 s = create_kmalloc_cache(x, text, realsize, flags);
2314 kmalloc_caches_dma[index] = s;
2315 return s;
2316 }
2317#endif 2323#endif
2318 return &kmalloc_caches[index]; 2324 return &kmalloc_caches[index];
2319} 2325}