/*
* Return 1 if free pages are above 'mark'. This takes into account the order
* of the allocation.
*/
int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
int classzone_idx, int alloc_flags)
{
/* free_pages my go negative - that's OK */
long min = mark;
long free_pages = zone_page_state(z, NR_FREE_PAGES) - (1 << order) + 1;
int o;
if (alloc_flags & ALLOC_HIGH)
min -= min / 2;
if (alloc_flags & ALLOC_HARDER)
min -= min / 4;
if (free_pages <= min + z->lowmem_reserve[classzone_idx])
return 0;
//在看书时,这个地方一时没看明白,今天重新看了一下,豁然开朗!
//举例来说,如果我们的分配阶为5,那么分配阶为4,3,2,1,0的
//free pages对这次分配来说相当于是无法使用的。但之前计算的
//free_pages中是包含这部分的,所以要去掉,如果去掉了这些边角料后
//free_pages<=min那么,也是没有办法进行分配的。
//nr_free<<0,是因为nr_free记载的是那个分配阶的空闲页块数。
for (o = 0; o < order; o++) {
/* At the next order, this order's pages become unavailable */
free_pages -= z->free_area[o].nr_free << o;
/* Require fewer higher order pages to be free */
min >>= 1;
if (free_pages <= min)
return 0;
}
return 1;
}