/* Do the hard work of removing an element from the buddy allocator. Call me with the zone->lock already held.  */
static struct page* __rmqueue(struct zone *zone, unsigned int order, int migratetype)
/* Do the hard work of removing an element from the buddy allocator. Call me with the zone->lock already held.  */
static struct page* __rmqueue(struct zone *zone, unsigned int order, int migratetype)
{
	struct page *page;
retry_reserve:
	page = __rmqueue_smallest(zone, order, migratetype);
	if (unlikely(!page) && migratetype != MIGRATE_RESERVE) {
		page = __rmqueue_fallback(zone, order, migratetype);
		if (!page) {
			migratetype = MIGRATE_RESERVE;
			goto retry_reserve;
		}
	}
	trace_mm_page_alloc_zone_locked(page, order, migratetype);
	return page;
}