*参照元 [#ob95301c] #backlinks *説明 [#g7a15691] -パス: [[linux-4.4.1/mm/page_alloc.c]] -FIXME: これは何? --説明 **引数 [#k9185d7d] -struct zone *z -- --[[linux-4.4.1/zone]] -unsigned int order -- -unsigned long mark -- -int classzone_idx -- -int alloc_flags -- -long free_pages -- **返り値 [#z73fc4e7] -bool -- **参考 [#c5f6dff3] *実装 [#b57e160f] /* * Return true if free base pages are above 'mark'. For high-order checks it * will return true of the order-0 watermark is reached and there is at least * one free page of a suitable size. Checking now avoids taking the zone lock * to check in the allocation paths if no pages are free. */ static bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark, int classzone_idx, int alloc_flags, long free_pages) { long min = mark; int o; const int alloc_harder = (alloc_flags & ALLOC_HARDER); - --[[linux-4.4.1/ALLOC_HARDER]] /* free_pages may go negative - that's OK */ free_pages -= (1 << order) - 1; if (alloc_flags & ALLOC_HIGH) min -= min / 2; - --[[linux-4.4.1/ALLOC_HIGH]] /* * 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)) free_pages -= z->nr_reserved_highatomic; else min -= min / 4; - --[[linux-4.4.1/likely()]] #ifdef CONFIG_CMA /* If allocation can't use CMA areas don't use free CMA pages */ if (!(alloc_flags & ALLOC_CMA)) free_pages -= zone_page_state(z, NR_FREE_CMA_PAGES); #endif - --[[linux-4.4.1/CONFIG_CMA]] --[[linux-4.4.1/ALLOC_CMA]] --[[linux-4.4.1/zone_page_state()]] /* * Check watermarks for an order-0 allocation request. If these * are not met, then a high-order request also cannot go ahead * even if a suitable page happened to be free. */ if (free_pages <= min + z->lowmem_reserve[classzone_idx]) return false; /* If this is an order-0 request then the watermark is fine */ if (!order) return true; /* For a high-order request, check at least one suitable page is free */ for (o = order; o < MAX_ORDER; o++) { struct free_area *area = &z->free_area[o]; int mt; - --[[linux-4.4.1/free_area]] if (!area->nr_free) continue; if (alloc_harder) return true; for (mt = 0; mt < MIGRATE_PCPTYPES; mt++) { if (!list_empty(&area->free_list[mt])) return true; } - --[[linux-4.4.1/MIGRATE_PCPTYPES]] --[[linux-4.4.1/list_empty()]] #ifdef CONFIG_CMA if ((alloc_flags & ALLOC_CMA) && !list_empty(&area->free_list[MIGRATE_CMA])) { return true; } #endif - --[[linux-4.4.1/MIGRATE_CMA]] } return false; } *コメント [#ac6bf389]