*参照元 [#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]


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