--- mm/slub.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) Index: linux-2.6.22-rc4-mm2/mm/slub.c =================================================================== --- linux-2.6.22-rc4-mm2.orig/mm/slub.c 2007-06-23 12:07:58.000000000 -0700 +++ linux-2.6.22-rc4-mm2/mm/slub.c 2007-06-23 12:08:17.000000000 -0700 @@ -3289,7 +3289,12 @@ static struct notifier_block __cpuinitda void *__kmalloc_track_caller(size_t size, gfp_t gfpflags, void *caller) { - struct kmem_cache *s = get_slab(size, gfpflags); + struct kmem_cache *s; + + if (unlikely(size > PAGE_SIZE / 2)) + return (void *)__get_free_pages(gfpflags | __GFP_COMP, + get_order(size)); + s = get_slab(size, gfpflags); if (ZERO_OR_NULL_PTR(s)) return s; @@ -3300,7 +3305,12 @@ void *__kmalloc_track_caller(size_t size void *__kmalloc_node_track_caller(size_t size, gfp_t gfpflags, int node, void *caller) { - struct kmem_cache *s = get_slab(size, gfpflags); + struct kmem_cache *s; + + if (unlikely(size > PAGE_SIZE / 2)) + return (void *)__get_free_pages(gfpflags | __GFP_COMP, + get_order(size)); + s = get_slab(size, gfpflags); if (ZERO_OR_NULL_PTR(s)) return s;