/*
* 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; //zone结构体里定义
<span style="white-space:pre"> </span>/* <span style="font-family: Arial, Helvetica, sans-serif;">zone_nr_free_pages获取剩余页帧数 减去需要分配的页帧数 </span><span style="font-family: Arial, Helvetica, sans-serif;">*/</span>
long free_pages = zone_nr_free_pages(z) - (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;
for (o = 0; o < order; o++) {
/* At the next order, this order's pages become unavailable */
<span style="white-space:pre"> </span>/* 将<order 比如order = 3, 则 0 1 2的buddy算法里的都不符合,减掉 */
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;
}