} malloc_sizes[] = {
#define CACHE(x) { .cs_size = (x) },
#include <linux/kmalloc_sizes.h>
+ { 0, }
#undef CACHE
};
/* Must match cache_sizes above. Out of line to keep cache footprint low. */
-static struct {
+static struct cache_names {
char *name;
char *name_dma;
} cache_names[] = {
*/
void __init kmem_cache_sizes_init(void)
{
- int i;
+ struct cache_sizes *sizes = malloc_sizes;
+ struct cache_names *names = cache_names;
+
/*
* Fragmentation resistance on low memory - only use bigger
* page orders on machines with more than 32MB of memory.
if (num_physpages > (32 << 20) >> PAGE_SHIFT)
slab_break_gfp_order = BREAK_GFP_ORDER_HI;
- for (i = 0; i < ARRAY_SIZE(malloc_sizes); i++) {
- struct cache_sizes *sizes = malloc_sizes + i;
+ while (sizes->cs_size) {
/* For performance, all the general caches are L1 aligned.
* This should be particularly beneficial on SMP boxes, as it
* eliminates "false sharing".
* Note for systems short on memory removing the alignment will
* allow tighter packing of the smaller caches. */
sizes->cs_cachep = kmem_cache_create(
- cache_names[i].name, sizes->cs_size,
+ names->name, sizes->cs_size,
0, SLAB_HWCACHE_ALIGN, NULL, NULL);
if (!sizes->cs_cachep)
BUG();
}
sizes->cs_dmacachep = kmem_cache_create(
- cache_names[i].name_dma, sizes->cs_size,
+ names->name_dma, sizes->cs_size,
0, SLAB_CACHE_DMA|SLAB_HWCACHE_ALIGN, NULL, NULL);
if (!sizes->cs_dmacachep)
BUG();
+
+ sizes++;
+ names++;
}
/*
* The generic caches are running - time to kick out the