diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/slub.c | 66 |
1 files changed, 36 insertions, 30 deletions
diff --git a/mm/slub.c b/mm/slub.c index 55b508df62a..2b50b97a0fc 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -2272,6 +2272,40 @@ panic: panic("Creation of kmalloc slab %s size=%d failed.\n", name, size); } +#ifdef CONFIG_ZONE_DMA +static noinline struct kmem_cache *dma_kmalloc_cache(int index, gfp_t flags) +{ + struct kmem_cache *s; + struct kmem_cache *x; + char *text; + size_t realsize; + + s = kmalloc_caches_dma[index]; + if (s) + return s; + + /* Dynamically create dma cache */ + x = kmalloc(kmem_size, flags & ~SLUB_DMA); + if (!x) + panic("Unable to allocate memory for dma cache\n"); + + if (index <= KMALLOC_SHIFT_HIGH) + realsize = 1 << index; + else { + if (index == 1) + realsize = 96; + else + realsize = 192; + } + + text = kasprintf(flags & ~SLUB_DMA, "kmalloc_dma-%d", + (unsigned int)realsize); + s = create_kmalloc_cache(x, text, realsize, flags); + kmalloc_caches_dma[index] = s; + return s; +} +#endif + static struct kmem_cache *get_slab(size_t size, gfp_t flags) { int index = kmalloc_index(size); @@ -2284,36 +2318,8 @@ static struct kmem_cache *get_slab(size_t size, gfp_t flags) return NULL; #ifdef CONFIG_ZONE_DMA - if ((flags & SLUB_DMA)) { - struct kmem_cache *s; - struct kmem_cache *x; - char *text; - size_t realsize; - - s = kmalloc_caches_dma[index]; - if (s) - return s; - - /* Dynamically create dma cache */ - x = kmalloc(kmem_size, flags & ~SLUB_DMA); - if (!x) - panic("Unable to allocate memory for dma cache\n"); - - if (index <= KMALLOC_SHIFT_HIGH) - realsize = 1 << index; - else { - if (index == 1) - realsize = 96; - else - realsize = 192; - } - - text = kasprintf(flags & ~SLUB_DMA, "kmalloc_dma-%d", - (unsigned int)realsize); - s = create_kmalloc_cache(x, text, realsize, flags); - kmalloc_caches_dma[index] = s; - return s; - } + if ((flags & SLUB_DMA)) + return dma_kmalloc_cache(index, flags); #endif return &kmalloc_caches[index]; } |