slub: fix handling of oversized slabs
authorAndrew Morton <akpm@linux-foundation.org>
Thu, 17 May 2007 05:10:54 +0000 (22:10 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Thu, 17 May 2007 12:23:03 +0000 (05:23 -0700)
I'm getting zillions of undefined references to __kmalloc_size_too_large on
alpha.  For some reason alpha is building out-of-line copies of kmalloc_slab()
into lots of compilation units.

It turns out that gcc just isn't smart enough to work out that
__builtin_contant_p(size)==true implies that __builtin_contant_p(index)==true.

So let's give it a bit of help.

Cc: 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

index 5e2e7297dfaaa5108a287cdf71371202bbf4a639..a9fb92862aaa360a4b8ad3f4112ed271e076ec74 100644 (file)
@@ -145,7 +145,12 @@ static inline struct kmem_cache *kmalloc_slab(size_t size)
        if (index == 0)
                return NULL;
 
-       if (index < 0) {
+       /*
+        * This function only gets expanded if __builtin_constant_p(size), so
+        * testing it here shouldn't be needed.  But some versions of gcc need
+        * help.
+        */
+       if (__builtin_constant_p(size) && index < 0) {
                /*
                 * Generate a link failure. Would be great if we could
                 * do something to stop the compile here.