SLUB: allocate smallest object size if the user asks for 0 bytes
authorChristoph Lameter <clameter@sgi.com>
Sun, 6 May 2007 21:49:38 +0000 (14:49 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 7 May 2007 19:12:53 +0000 (12:12 -0700)
Makes SLUB behave like SLAB in this area to avoid issues....

Throw a stack dump to alert people.

At some point the behavior should be switched back.  NULL is no memory as
far as I can tell and if the use asked for 0 bytes then he need to get no
memory.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/slub_def.h
mm/slub.c

index 30b154ce7289e6262f9d2b9aecc2dabf742d716d..f8e0c86c48a93a00b445171874b1b134e06a60e9 100644 (file)
@@ -80,8 +80,12 @@ extern struct kmem_cache kmalloc_caches[KMALLOC_SHIFT_HIGH + 1];
  */
 static inline int kmalloc_index(int size)
 {
-       if (size == 0)
-               return 0;
+       /*
+        * We should return 0 if size == 0 but we use the smallest object
+        * here for SLAB legacy reasons.
+        */
+       WARN_ON_ONCE(size == 0);
+
        if (size > 64 && size <= 96)
                return 1;
        if (size > 128 && size <= 192)
index 4a8585befd84887a2e31d26bf95d0019cca5c110..9d52cce7c9992f6f89cf33902461d9c67c52e08c 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1979,7 +1979,7 @@ static struct kmem_cache *get_slab(size_t size, gfp_t flags)
 {
        int index = kmalloc_index(size);
 
-       if (!size)
+       if (!index)
                return NULL;
 
        /* Allocation too large? */