diff options
author | Christoph Lameter <clameter@sgi.com> | 2008-03-01 22:56:40 +0100 |
---|---|---|
committer | Christoph Lameter <clameter@sgi.com> | 2008-03-03 21:22:32 +0100 |
commit | f619cfe1bda809a97c407f4c723eb3235ecd64e5 (patch) | |
tree | d073f8fe0221c2c196aaa888e7bc861c275f7fbd | |
parent | slub: look up object from the freelist once (diff) | |
download | linux-f619cfe1bda809a97c407f4c723eb3235ecd64e5.tar.xz linux-f619cfe1bda809a97c407f4c723eb3235ecd64e5.zip |
slub: Add kmalloc_large_node() to support kmalloc_node fallback
Slub is missing some NUMA support for large kmallocs. Provide that.
Reviewed-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Christoph Lameter <clameter@sgi.com>
-rw-r--r-- | mm/slub.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/mm/slub.c b/mm/slub.c index db8026ba049f..ecacacdce9d7 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -2592,13 +2592,24 @@ void *__kmalloc(size_t size, gfp_t flags) } EXPORT_SYMBOL(__kmalloc); +static void *kmalloc_large_node(size_t size, gfp_t flags, int node) +{ + struct page *page = alloc_pages_node(node, flags | __GFP_COMP, + get_order(size)); + + if (page) + return page_address(page); + else + return NULL; +} + #ifdef CONFIG_NUMA void *__kmalloc_node(size_t size, gfp_t flags, int node) { struct kmem_cache *s; if (unlikely(size > PAGE_SIZE)) - return kmalloc_large(size, flags); + return kmalloc_large_node(size, flags, node); s = get_slab(size, flags); @@ -3146,7 +3157,7 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t gfpflags, struct kmem_cache *s; if (unlikely(size > PAGE_SIZE)) - return kmalloc_large(size, gfpflags); + return kmalloc_large_node(size, gfpflags, node); s = get_slab(size, gfpflags); |