点击(此处)折叠或打开
-
int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
-
int classzone_idx, int can_try_harder, int gfp_high)
-
{
-
/* free_pages my go negative - that's OK */
- long min = mark, free_pages = z->free_pages - (1 << order) + 1;
-
int o;
-
-
/*如果gfp_high标志被置位。通常atomic方式会置此标记。那么将水线降低一半,即内存分配可以穿越水线一半*/
-
if (gfp_high)
-
min -= min / 2;
-
/*如果can_try_harder标志被置位,水线再减少1/4,can_try_harder通常是当进程是一个实时进程并且在进程上下文中已经完成了内存分配。*/
-
if (can_try_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 */
- /* 扣除小于目标order的内存块,比如分配内存是指定的order为3,即需要分配32k大小的内存,此时需要扣除掉小于32k大小的内存块,
-
因为这些块的大小不足以分配32k的连续空间*/
-
free_pages -= z->free_area[o].nr_free << o;
-
/* Require fewer higher order pages to be free */
- /*每扣除一个order的块,需要将水线除以2,目的是将水线分担到各个order,当order为3时,最终需要>=32k的内存块的容量>min/8,
- 才能继续分配内存*/
-
min >>= 1;
-
-
if (free_pages <= min)
-
return 0;
-
}
-
return 1;
- }