参照元†
- 各構造体の関係
- zone を探す(この関数に来た時点で既に決定されている、zone 引数で指定される)
- free_area を探す(確保するサイズのオーダーに応じて別れている)
- free_list を探す(適切なサイズの空きページが並んだリスト)
- 空きページを探す
struct zone {
...
struct free_area free_area[MAX_ORDER]
strict free_area {
...
struct list_head free_list[MIGRATE_TYPES];
- もし見つからなければ、より大きいサイズ用の free_area を探しに行く。
- struct zone *zone
- unsigned int order
- int migratetype
返り値†
/*
* Go through the free lists for the given migratetype and remove
* the smallest available page from the freelists
*/
static 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]);
if (list_empty(&area->free_list[migratetype]))
continue;
page = list_entry(area->free_list[migratetype].next,
struct page, lru);
list_del(&page->lru);
rmv_page_order(page);
area->nr_free--;
expand(zone, page, order, current_order, area, migratetype);
set_pcppage_migratetype(page, migratetype);
return page;
}
return NULL;
}
コメント†