参照元†
- FIXME: これは何?
- 説明
- 呼び出し側は zone->lock を取得していなければならない。
- struct zone *zone
- unsigned int order
- 確保するページ数のオーダー、2 のべき乗で指定する
- 0 なら 1 ページ、1 なら 2 ページ、n なら 2^n ページ
- int migratetype
- マイグレーションの種類、MIGRATE_XXX を指定する
- gfp_t gfp_flags
返り値†
/*
* 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, gfp_t gfp_flags)
{
struct page *page;
page = __rmqueue_smallest(zone, order, migratetype);
- マイグレーションの種類が指している free_list から、空き領域を取得する。
if (unlikely(!page)) {
if (migratetype == MIGRATE_MOVABLE)
page = __rmqueue_cma_fallback(zone, order);
- MIGRATE_MOVABLE から空き領域が取得できない場合は、CMA 領域から空き領域を取得する。
if (!page)
page = __rmqueue_fallback(zone, order, migratetype);
}
trace_mm_page_alloc_zone_locked(page, order, migratetype);
return page;
}
コメント†