super皮波 发表于 2015-01-24 21:31

内存分配水位判断问题__zone_watermark_ok

版本3.10.17
static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
                      int classzone_idx, int alloc_flags, long free_pages)
{
        /* free_pages my go negative - that's OK */
        long min = mark;
        int o;

        free_pages -= (1 << order) + 1;这里还要+1是出于什么考虑呢?
        if (alloc_flags & ALLOC_HIGH)
                min -= min / 2;
        if (alloc_flags & ALLOC_HARDER)
                min -= min / 4;

        if (free_pages <= min + z->lowmem_reserve)
                return false;
        for (o = 0; o < order; o++) {
                /* At the next order, this order's pages become unavailable */
                free_pages -= z->free_area.nr_free << o;

                /* Require fewer higher order pages to be free */
                min >>= 1;

                if (free_pages <= min)
                        return false;
        }
        return true;
}

super皮波 发表于 2015-01-24 21:55

还有一个疑问
for (o = 0; o < order; o++) {
                /* At the next order, this order's pages become unavailable */
                free_pages -= z->free_area.nr_free << o;

                /* Require fewer higher order pages to be free */
                min >>= 1;这里的每次右移一位,这里的1是基于什么考虑呢?

                if (free_pages <= min)
                        return false;
      }

humjb_1983 发表于 2015-01-26 09:51

super皮波 发表于 2015-01-24 21:31 static/image/common/back.gif
版本3.10.17
static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
                      ...
这里的“-(1 << order) + 1;”应该是一个整体,用于保证free pages至少比min(水线)大一个order,这里的加1应该只是为了对齐而已。
比如order==2时,加入free_pages分别等于:
36
35
34
33
时,水线ok的min的最大值分别为
32 31 30和29

humjb_1983 发表于 2015-01-26 09:54

super皮波 发表于 2015-01-24 21:55 static/image/common/back.gif
还有一个疑问
for (o = 0; o < order; o++) {
                /* At the next order, this order's page ...
这里的意思应该是:
/*每扣除一个order的块,需要将水线除以2,目的是将水线分担到各个order,当order为3时,最终需要>=32k的内存块的容量>min/8,
    才能继续分配内存*/
参考:
http://blog.chinaunix.net/uid-14528823-id-4146032.html

super皮波 发表于 2015-01-26 09:56

回复 4# humjb_1983

我的意思是每次除以2,基于什么考虑,为什么不是除以3或者其他
   

humjb_1983 发表于 2015-01-26 13:52

super皮波 发表于 2015-01-26 09:56 static/image/common/back.gif
回复 4# humjb_1983

我的意思是每次除以2,基于什么考虑,为什么不是除以3或者其他
这个估计就是经验值了,从与buddy system的一致性来说,以order来移位(除2)看似也是相对合理的。
页: [1]
查看完整版本: 内存分配水位判断问题__zone_watermark_ok