*参照元 [#l0463606] #backlinks *説明 [#r11e849d] -パス: [[linux-4.4.1/mm/page_alloc.c]] -FIXME: これは何? --説明 -各構造体の関係 --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 を探しに行く。 **引数 [#n51b0c25] -struct zone *zone -- --[[linux-4.4.1/zone]] -unsigned int order -- -int migratetype -- **返り値 [#beec5374] -struct page * -- --[[linux-4.4.1/page]] **参考 [#p6d04f2d] *実装 [#z10fda94] /* * 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; - --[[linux-4.4.1/free_area]] --[[linux-4.4.1/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; - --[[linux-4.4.1/list_empty()]] page = list_entry(area->free_list[migratetype].next, struct page, lru); list_del(&page->lru); - --[[linux-4.4.1/list_entry()]] --[[linux-4.4.1/list_del()]] rmv_page_order(page); area->nr_free--; expand(zone, page, order, current_order, area, migratetype); set_pcppage_migratetype(page, migratetype); return page; - --[[linux-4.4.1/rmv_page_order()]] --[[linux-4.4.1/expand()]] --[[linux-4.4.1/set_pcppage_migratetype()]] } return NULL; } *コメント [#j5ecfd65]