page allocator: replace __alloc_pages_internal() with __alloc_pages_nodemask()
authorMel Gorman <>
Tue, 16 Jun 2009 22:31:52 +0000 (15:31 -0700)
committerLinus Torvalds <>
Wed, 17 Jun 2009 02:47:32 +0000 (19:47 -0700)
The start of a large patch series to clean up and optimise the page

The performance improvements are in a wide range depending on the exact
machine but the results I've seen so fair are approximately;

kernbench: 0 to  0.12% (elapsed time)
0.49% to  3.20% (sys time)
aim9: -4% to 30% (for page_test and brk_test)
tbench: -1% to  4%
hackbench: -2.5% to  3.45% (mostly within the noise though)
netperf-udp -1.34%  to  4.06% (varies between machines a bit)
netperf-tcp -0.44%  to  5.22% (varies between machines a bit)

I haven't sysbench figures at hand, but previously they were within the
-0.5% to 2% range.

On netperf, the client and server were bound to opposite number CPUs to
maximise the problems with cache line bouncing of the struct pages so I
expect different people to report different results for netperf depending
on their exact machine and how they ran the test (different machines, same
cpus client/server, shared cache but two threads client/server, different
socket client/server etc).

I also measured the vmlinux sizes for a single x86-based config with
CONFIG_DEBUG_INFO enabled but not CONFIG_DEBUG_VM.  The core of the
.config is based on the Debian Lenny kernel config so I expect it to be
reasonably typical.

This patch:

__alloc_pages_internal is the core page allocator function but essentially
it is an alias of __alloc_pages_nodemask.  Naming a publicly available and
exported function "internal" is also a big ugly.  This patch renames
__alloc_pages_internal() to __alloc_pages_nodemask() and deletes the old
nodemask function.

Warning - This patch renames an exported symbol.  No kernel driver is
affected by external drivers calling __alloc_pages_internal() should
change the call to __alloc_pages_nodemask() without any alteration of

Signed-off-by: Mel Gorman <>
Reviewed-by: Christoph Lameter <>
Reviewed-by: KOSAKI Motohiro <>
Reviewed-by: Pekka Enberg <>
Cc: Peter Zijlstra <>
Cc: Nick Piggin <>
Cc: Dave Hansen <>
Cc: Lee Schermerhorn <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

index 3760e7c5de0264aaec173486daca51035e80b252..549ec5583103acd3ee9128a3062a998702f8daed 100644 (file)
@@ -172,24 +172,16 @@ static inline void arch_alloc_page(struct page *page, int order) { }
 struct page *
-__alloc_pages_internal(gfp_t gfp_mask, unsigned int order,
+__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
                       struct zonelist *zonelist, nodemask_t *nodemask);
 static inline struct page *
 __alloc_pages(gfp_t gfp_mask, unsigned int order,
                struct zonelist *zonelist)
-       return __alloc_pages_internal(gfp_mask, order, zonelist, NULL);
+       return __alloc_pages_nodemask(gfp_mask, order, zonelist, NULL);
-static inline struct page *
-__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
-               struct zonelist *zonelist, nodemask_t *nodemask)
-       return __alloc_pages_internal(gfp_mask, order, zonelist, nodemask);
 static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,
                                                unsigned int order)
index cbed869fd831ae39c1ffe6200f58cc5682646a13..d58df9031503f639b337194fa188c729409f5f15 100644 (file)
@@ -1458,7 +1458,7 @@ try_next_zone:
  * This is the 'heart' of the zoned buddy allocator.
 struct page *
-__alloc_pages_internal(gfp_t gfp_mask, unsigned int order,
+__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
                        struct zonelist *zonelist, nodemask_t *nodemask)
        const gfp_t wait = gfp_mask & __GFP_WAIT;
@@ -1667,7 +1667,7 @@ nopage:
        return page;
  * Common helper functions.