Skip to content

Commit

Permalink
SLUB: extract dma_kmalloc_cache from get_cache.
Browse files Browse the repository at this point in the history
The rarely used dma functionality in get_slab() makes the function too
complex.  The compiler begins to spill variables from the working set onto the
stack.  The created function is only used in extremely rare cases so make sure
that the compiler does not decide on its own to merge it back into get_slab().

Signed-off-by: Christoph Lameter <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Christoph Lameter authored and Linus Torvalds committed Jul 17, 2007
1 parent 0c71001 commit 2e443fd
Showing 1 changed file with 36 additions and 30 deletions.
66 changes: 36 additions & 30 deletions mm/slub.c
Original file line number Diff line number Diff line change
Expand Up @@ -2272,6 +2272,40 @@ static struct kmem_cache *create_kmalloc_cache(struct kmem_cache *s,
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);
Expand All @@ -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];
}
Expand Down

0 comments on commit 2e443fd

Please sign in to comment.