*参照元 [#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]

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS