#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]