Index: 2.6.13-joel2/mm/page_alloc.c =================================================================== --- 2.6.13-joel2.orig/mm/page_alloc.c 2005-09-21 11:13:14.%N -0500 +++ 2.6.13-joel2/mm/page_alloc.c 2005-09-21 11:14:49.%N -0500 @@ -944,7 +944,8 @@ __alloc_pages(unsigned int __nocast gfp_ int can_try_harder; int did_some_progress; int alloctype; - + int highorder_retry = 3; + alloctype = (gfp_mask & __GFP_RCLM_BITS); might_sleep_if(wait); @@ -1090,7 +1091,14 @@ rebalance: goto got_pg; } - out_of_memory(gfp_mask, order); + if (order < MAX_ORDER/2) out_of_memory(gfp_mask, order); + /* + * Due to low fragmentation efforts, we should try a little + * harder to satisfy high order allocations + */ + if (order >= MAX_ORDER/2 && --highorder_retry > 0) + goto rebalance; + goto restart; } @@ -1107,6 +1115,8 @@ rebalance: do_retry = 1; if (gfp_mask & __GFP_NOFAIL) do_retry = 1; + if (order >= MAX_ORDER/2 && --highorder_retry > 0) + do_retry = 1; } if (do_retry) { blk_congestion_wait(WRITE, HZ/50);