linux-5.15/__rmqueue_smallest()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#x11332c7]
#backlinks
*説明 [#j7522234]
-パス: [[linux-5.15/mm/page_alloc.c]]
-与えられたマイグレーションの種類(MIGRATE_XXX)からfree_...
-主なデータ構造と処理の流れ
--zoneを探す(この関数に来た時点で既に決定されている、zon...
---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の選択に使われる
-int migratetype
--マイグレーションの種類、MIGRATE_XXXを指定する
--free_listの選択に使われる
**返り値 [#w18e4b32]
-struct page *
--確保した領域の先頭ページ
--[[linux-5.15/page]]
**参考 [#kb707ffa]
*実装 [#h753172b]
/*
* Go through the free lists for the given migratetype a...
* the smallest available page from the freelists
*/
static __always_inline
struct page *__rmqueue_smallest(struct zone *zone, unsig...
int migratetype)
{
unsigned int current_order;
struct free_area *area;
struct page *page;
/* Find a page of the appropriate size in the preferred...
for (current_order = order; current_order < MAX_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]
終了行:
*参照元 [#x11332c7]
#backlinks
*説明 [#j7522234]
-パス: [[linux-5.15/mm/page_alloc.c]]
-与えられたマイグレーションの種類(MIGRATE_XXX)からfree_...
-主なデータ構造と処理の流れ
--zoneを探す(この関数に来た時点で既に決定されている、zon...
---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の選択に使われる
-int migratetype
--マイグレーションの種類、MIGRATE_XXXを指定する
--free_listの選択に使われる
**返り値 [#w18e4b32]
-struct page *
--確保した領域の先頭ページ
--[[linux-5.15/page]]
**参考 [#kb707ffa]
*実装 [#h753172b]
/*
* Go through the free lists for the given migratetype a...
* the smallest available page from the freelists
*/
static __always_inline
struct page *__rmqueue_smallest(struct zone *zone, unsig...
int migratetype)
{
unsigned int current_order;
struct free_area *area;
struct page *page;
/* Find a page of the appropriate size in the preferred...
for (current_order = order; current_order < MAX_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]
ページ名: