#author("2025-09-10T10:37:20+09:00","default:guest","guest")
#author("2025-09-10T16:52:57+09:00","default:guest","guest")
*参照元 [#t204ac22]
#backlinks

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

-FIXME: これは何?
--説明


**引数 [#pfd6e79a]
-struct zone *z
--メモリゾーン。
--[[linux-5.15/zone]]
-unsigned int order
--オーダー。カーネルのメモリ確保関数は、ページ数を2^orderの形で表すことがある。つまりorder 0 = 1ページ, order 1 = 2ページ, order 2 = 4ページ, order 3 = 8ページのようになる。
-unsigned int alloc_flags
--


**返り値 [#d6a3547f]
-long
--freeページだが指定された条件では使用不可能なページ数。


**参考 [#z410107d]


*実装 [#hae1cfd9]

 static inline long __zone_watermark_unusable_free(struct zone *z,
 				unsigned int order, unsigned int alloc_flags)
 {
 	const bool alloc_harder = (alloc_flags & (ALLOC_HARDER|ALLOC_OOM));
 	long unusable_free = (1 << order) - 1;
 

(1 << order) - 1が使用不可能なページ数の初期値となる。
-order 2:  4 - 1 = 3
-order 4: 16 - 1 = 15

 	long unusable_free = (1 << order) - 1;
 

ALLOC_HARDERかALLOC_OOMを指定しない限り、MIGRATE_HIGHATOMICの領域は使わない。

 	/*
 	 * If the caller does not have rights to ALLOC_HARDER then subtract
 	 * the high-atomic reserves. This will over-estimate the size of the
 	 * atomic reserve but it avoids a search.
 	 */
 	if (likely(!alloc_harder))
 		unusable_free += z->nr_reserved_highatomic;
 
ALLOC_CMAを指定しない限り、MIGRATE_CMAの領域は使わない。
--[[linux-5.15/zone_page_state()]]

ALLOC_HARDERかALLOC_OOMを指定しない限り、MIGRATE_HIGHATOMICの領域は使わない。

 #ifdef CONFIG_CMA
 	/* If allocation can't use CMA areas don't use free CMA pages */
 	if (!(alloc_flags & ALLOC_CMA))
 		unusable_free += zone_page_state(z, NR_FREE_CMA_PAGES);
 #endif
 

ALLOC_CMAを指定しない限り、MIGRATE_CMAの領域は使わない。
--[[linux-5.15/zone_page_state()]]

 	return unusable_free;
 }


*コメント [#i5150f0d]

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