本文主要是介绍区zone的水位检查__zone_watermark_ok,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Linux内核的内存管理中,整个内存以zone为单位进行维护,函数__zone_watermark_ok()
用于对zone的水位进行检查,其主要是处理min和free_pages两个关系。
函数根据不同条件缩减或者扩张两个对象。
函数实现如下
mm/page_alloc.c
函数返回真,如果水位检查ok,否则返回false。
需要注意对order-0和order非零检查的不同。 /* * 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. */ bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark, int classzone_idx, unsigned int alloc_flags, long free_pages) { long min = mark; int o; const bool alloc_harder = (alloc_flags & ALLOC_HARDER);
/* free_pages may go negative - that's OK */ free_pages -= (1 << order) - 1;
if (alloc_flags & ALLOC_HIGH) min -= min / 2;
/* * 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;
#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
/* * 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;
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; }
#ifdef CONFIG_CMA if ((alloc_flags & ALLOC_CMA) && !list_empty(&area->free_list[MIGRATE_CMA])) { return true; } #endif } return false; }
这篇关于区zone的水位检查__zone_watermark_ok的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!