#author("2025-10-31T10:50:12+09:00","default:guest","guest")
#author("2025-10-31T11:22:01+09:00","default:guest","guest")
*参照元 [#x11332c7]
#backlinks

*説明 [#j7522234]
-パス: [[linux-5.15/mm/page_alloc.c]]

-与えられたマイグレーションの種類(MIGRATE_XXX)からfree_listを探し、要求されたサイズに合う最も小さい領域を返す。

-主なデータ構造と処理の流れ
--zoneを探す(この関数に来た時点で既に決定されている、zone 引数で指定される)
---ZONE_DMA, ZONE_NORMALなど
--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]
 ...


**引数 [#hc2b0655]
-struct zone *zone
--メモリゾーン
--[[linux-5.15/zone]]
-unsigned int order
--メモリオーダー、2 のべき乗で指定する
--0 なら 1 ページ、1 なら 2 ページ、n なら 2^n ページ
--free_area の選択に使われる
--メモリオーダー、2のべき乗で指定する
--0なら1ページ、1なら2ページ、nなら2^nページ
--free_areaの選択に使われる
-int migratetype
--マイグレーションの種類、MIGRATE_XXX を指定する
--free_list の選択に使われる
--マイグレーションの種類、MIGRATE_XXXを指定する
--free_listの選択に使われる


**返り値 [#w18e4b32]
-struct page *
--確保した領域の先頭ページ
--[[linux-5.15/page]]


**参考 [#kb707ffa]


*実装 [#h753172b]
 /*
  * 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;
 }

-
--[[linux-5.15/page]]
--[[linux-5.15/get_page_from_free_area()]]
--[[linux-5.15/del_page_from_free_list()]]
--[[linux-5.15/expand()]]
--[[linux-5.15/set_pcppage_migratetype()]]


*コメント [#l531f39b]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS