page allocator: inline __rmqueue_smallest()
Inline __rmqueue_smallest by altering flow very slightly so that there is only one call site. Because there is only one call-site, this function can then be inlined without causing text bloat. On an x86-based config, this patch reduces text by 16 bytes. Signed-off-by: Mel Gorman <mel@csn.ul.ie> Reviewed-by: Christoph Lameter <cl@linux-foundation.org> Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Pekka Enberg <penberg@cs.helsinki.fi> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Dave Hansen <dave@linux.vnet.ibm.com> Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
a56f57ff94
commit
728ec980fb
1 changed files with 16 additions and 4 deletions
|
@ -661,7 +661,8 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
|
||||||
* Go through the free lists for the given migratetype and remove
|
* Go through the free lists for the given migratetype and remove
|
||||||
* the smallest available page from the freelists
|
* the smallest available page from the freelists
|
||||||
*/
|
*/
|
||||||
static struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,
|
static inline
|
||||||
|
struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,
|
||||||
int migratetype)
|
int migratetype)
|
||||||
{
|
{
|
||||||
unsigned int current_order;
|
unsigned int current_order;
|
||||||
|
@ -831,8 +832,7 @@ static struct page *__rmqueue_fallback(struct zone *zone, int order,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use MIGRATE_RESERVE rather than fail an allocation */
|
return NULL;
|
||||||
return __rmqueue_smallest(zone, order, MIGRATE_RESERVE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -844,11 +844,23 @@ static struct page *__rmqueue(struct zone *zone, unsigned int order,
|
||||||
{
|
{
|
||||||
struct page *page;
|
struct page *page;
|
||||||
|
|
||||||
|
retry_reserve:
|
||||||
page = __rmqueue_smallest(zone, order, migratetype);
|
page = __rmqueue_smallest(zone, order, migratetype);
|
||||||
|
|
||||||
if (unlikely(!page))
|
if (unlikely(!page) && migratetype != MIGRATE_RESERVE) {
|
||||||
page = __rmqueue_fallback(zone, order, migratetype);
|
page = __rmqueue_fallback(zone, order, migratetype);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use MIGRATE_RESERVE rather than fail an allocation. goto
|
||||||
|
* is used because __rmqueue_smallest is an inline function
|
||||||
|
* and we want just one call site
|
||||||
|
*/
|
||||||
|
if (!page) {
|
||||||
|
migratetype = MIGRATE_RESERVE;
|
||||||
|
goto retry_reserve;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue