参照元†
- 与えられたマイグレーションの種類(MIGRATE_XXX)からfree_listを探し、要求されたサイズに合う最も小さい領域を返す。
- 主なデータ構造と処理の流れ
- zoneを探す(この関数に来た時点で既に決定されている、zone 引数で指定される)
- free_areaを探す(確保するサイズのメモリオーダーごとに分かれている)
- 1ページ(オーダー 0)
- 2ページ(オーダー 1)
- 4ページ(オーダー 2)
- 8ページ(オーダー 3)
- ...
- オーダーは MAX_ORDER - 1 が最大
- free_listを探す(2^nページの空き領域の先頭ページが並んだリスト)
free_area[0] : [page 0], [page 8], [page 12]
free_area[1] : [page 2, 3], [page 10, 11]
free_area[2] : [page 4, 5, 6, 7]
...
- struct zone *zone
- unsigned int order
- メモリオーダー、2 のべき乗で指定する
- 0 なら 1 ページ、1 なら 2 ページ、n なら 2^n ページ
- free_area の選択に使われる
- int migratetype
- マイグレーションの種類、MIGRATE_XXX を指定する
- free_list の選択に使われる
返り値†
/*
* Go through the free lists for the given migratetype and remove
* the smallest available page from the freelists
*/
static __always_inline
struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,
int migratetype)
{
unsigned int current_order;
struct free_area *area;
struct page *page;
/* Find a page of the appropriate size in the preferred list */
for (current_order = order; current_order < MAX_ORDER; ++current_order) {
area = &(zone->free_area[current_order]);
page = get_page_from_free_area(area, migratetype);
if (!page)
continue;
del_page_from_free_list(page, zone, current_order);
expand(zone, page, order, current_order, migratetype);
set_pcppage_migratetype(page, migratetype);
return page;
}
return NULL;
}
コメント†