]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Fix kmalloc_sizes[] indexing
authorAndrew Morton <akpm@digeo.com>
Sat, 12 Apr 2003 19:58:14 +0000 (12:58 -0700)
committerJames Bottomley <jejb@raven.il.steeleye.com>
Sat, 12 Apr 2003 19:58:14 +0000 (12:58 -0700)
From: Brian Gerst and David Mosberger

The previous fix to the kmalloc_sizes[] array didn't null-terminate the
correct array.

Fix that up, and also avoid running ARRAY_SIZE() against an array which is
really a null-terminated list.

mm/slab.c

index e788a0e3a09e7feef0c7421343524f64adcd3bb4..332837c15d620c58d96994363ee882aea37cee76 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -383,11 +383,12 @@ static struct cache_sizes {
 } 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[] = {
@@ -596,7 +597,9 @@ void __init kmem_cache_init(void)
  */
 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.
@@ -604,15 +607,14 @@ void __init kmem_cache_sizes_init(void)
        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();
@@ -624,10 +626,13 @@ void __init kmem_cache_sizes_init(void)
                }
 
                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