- 论坛徽章:
- 1
|
本帖最后由 firkraag 于 2012-11-21 12:47 编辑
在_zone_watermark_ok中:
static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
1599 int classzone_idx, int alloc_flags, long free_pages)
1600{
1601 /* free_pages my go negative - that's OK */
1602 long min = mark;
1603 long lowmem_reserve = z->lowmem_reserve[classzone_idx];
1604 int o;
1605
1606 free_pages -= (1 << order)- 1;///??????
1607 if (alloc_flags & ALLOC_HIGH)
1608 min -= min / 2;
1609 if (alloc_flags & ALLOC_HARDER)
1610 min -= min / 4;
1611
1612 if (free_pages <= min + lowmem_reserve)
1613 return false;
1614 for (o = 0; o < order; o++) {
1615 /* At the next order, this order's pages become unavailable */
1616 free_pages -= z->free_area[o].nr_free << o;
1617
1618 /* Require fewer higher order pages to be free */
1619 min >>= 1;
1620
1621 if (free_pages <= min)
1622 return false;
1623 }
1624 return true;
1625}
计算free_pages时,相当于free_pages=free_pages-(1<<order)+1;多的那个"+1"(就是程序中的那个"-1")起什么作用呢? |
|