|
@@ -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];
|
|
|
}
|