*参照元 [#z9008f04] #backlinks *説明 [#z719c29e] -パス: [[linux-4.4.1/mm/page_alloc.c]] -FIXME: これは何? --説明 --呼び出し側は zone->lock を取得していなければならない。 **引数 [#tb6b2860] -struct zone *zone --ゾーン --[[linux-4.4.1/zone]] -unsigned int order --確保するページ数のオーダー、2 のべき乗で指定する --0 なら 1 ページ、1 なら 2 ページ、n なら 2^n ページ -int migratetype --マイグレーションの種類、MIGRATE_XXX を指定する -gfp_t gfp_flags --GFP (Get Free Page) フラグ --この関数では参照されない --[[linux-4.4.1/gfp_t]] **返り値 [#g2fc8214] -struct page * -- --[[linux-4.4.1/page]] **参考 [#u697d057] *実装 [#u62bbc35] /* * 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 から、空き領域を取得する。 --[[linux-4.4.1/__rmqueue_smallest()]] if (unlikely(!page)) { if (migratetype == MIGRATE_MOVABLE) page = __rmqueue_cma_fallback(zone, order); - -MIGRATE_MOVABLE から空き領域が取得できない場合は、CMA 領域から空き領域を取得する。 --[[linux-4.4.1/unlikely()]] --[[linux-4.4.1/MIGRATE_MOVABLE]] --[[linux-4.4.1/__rmqueue_cma_fallback()]] if (!page) page = __rmqueue_fallback(zone, order, migratetype); - -それでもダメならフォールバック処理。 --[[linux-4.4.1/__rmqueue_fallback()]] } trace_mm_page_alloc_zone_locked(page, order, migratetype); return page; - --[[linux-4.4.1/trace_mm_page_alloc_zone_locked()]] } *コメント [#v0579995]