免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: blake326
打印 上一主题 下一主题

[内存管理] linux pte 的L_PTE_YOUNG作用 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-06-06 11:07 |只看该作者
回复 10# firkraag


    多谢指导,差不多有点理解了。


    主要是通过清除young标志时,同时清空了hw pte。从而导致再次访问产生确页异常,然后根据linux pte重新设置young标志。

   不过还是有点疑问,比如一个anon page。

   1. 用户太首次访问,确页异常,设置young,page在active anon lru。
   2. shrink anon active, 清除young标志和hw pte。由于之前设置了young,所以将page仍然放回到active anon lru。
   3. shrink anon active, 由于此时没有young标志,所以直接page被放入到inactive anon lru.
   4. shrink anon inactive, 由于此时没有young标志,所以直接page被释放到伙伴系统。

如果在2之后,3或者4之前来再次访问该page,那么确页异常将会重设pte的young。那么在3或者4的时候,pfra会发现有young pte,所以将page加回到active anon lru。

问题是:如果在4之后,再次访问该page,产生确页异常,重设pte的young?但是这个时候page已经释放到伙伴系统了。这个映射不能使用了,怎么处理的?



   

论坛徽章:
0
12 [报告]
发表于 2013-06-06 11:07 |只看该作者
回复 4# embeddedlwp


        多谢指导,差不多有点理解了。


    主要是通过清除young标志时,同时清空了hw pte。从而导致再次访问产生确页异常,然后根据linux pte重新设置young标志。

   不过还是有点疑问,比如一个anon page。

   1. 用户太首次访问,确页异常,设置young,page在active anon lru。
   2. shrink anon active, 清除young标志和hw pte。由于之前设置了young,所以将page仍然放回到active anon lru。
   3. shrink anon active, 由于此时没有young标志,所以直接page被放入到inactive anon lru.
   4. shrink anon inactive, 由于此时没有young标志,所以直接page被释放到伙伴系统。

如果在2之后,3或者4之前来再次访问该page,那么确页异常将会重设pte的young。那么在3或者4的时候,pfra会发现有young pte,所以将page加回到active anon lru。

问题是:如果在4之后,再次访问该page,产生确页异常,重设pte的young?但是这个时候page已经释放到伙伴系统了。这个映射不能使用了,怎么处理的?

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
13 [报告]
发表于 2013-06-06 11:22 |只看该作者
回复 12# blake326


不过还是有点疑问,比如一个anon page。

   1. 用户太首次访问,确页异常,设置young,page在active anon lru。
   2. shrink anon active, 清除young标志和hw pte。由于之前设置了young,所以将page仍然放回到active anon lru。

===============================================
看来我之前的回复忘记考虑shrink anon active的时候access/young bit被clean的情况

   3. shrink anon active, 由于此时没有young标志,所以直接page被放入到inactive anon lru.
   4. shrink anon inactive, 由于此时没有young标志,所以直接page被释放到伙伴系统。

================================================
你这里是3次age,实际是上2次age,shrink anon active的时候,即使anon page的access/young bit被set了,仍然age到inactive list,只有VM_EXEC的file page会被照顾一下,因为这样桌面应用程序的response比较好

如果在2之后,3或者4之前来再次访问该page,那么确页异常将会重设pte的young。那么在3或者4的时候,pfra会发现有young pte,所以将page加回到active anon lru。

问题是:如果在4之后,再次访问该page,产生确页异常,重设pte的young?但是这个时候page已经释放到伙伴系统了。这个映射不能使用了,怎么处理的?

================================================
针对2次age,是否你可以重新说下问题?


   

论坛徽章:
0
14 [报告]
发表于 2013-06-06 12:43 |只看该作者
本帖最后由 blake326 于 2013-06-06 12:47 编辑

回复 13# embeddedlwp


更正一下理解,比如一个anon page:
   1. 用户太首次访问,确页异常,设置young,page在active anon lru。
   2. shrink anon active, 清除young标志和hw pte。由于之前设置了young,所以将page仍然放回到active anon lru。
。。。。这个时候,如果用户太再次访问相应的线性地址,产生确页异常,重新设置young标志。这样,pfra在下次shrink anon active的时候就会发现该page最近被访问过,就会重新加入到active anon lru中。也就是跳转到第1步。
   3. shrink anon active, 由于此时没有young标志,所以直接page被放入到inactive anon lru. 同时通过try_to_unmap解除pte映射(清空hw/linux pte)
。。。假设这个时候用户太又访问到相应的线性地址的话,由于已经彻底解除了与之前的page pte映射关系。确页异常重新做do_anonymous_page处理,重新分配new page。
   4. shrink anon inactive, 由于此时没有young标志(在anon inactive lru中的page与用户pte没有关系了,应该不会被重新设置该位),所以直接page被释放到伙伴系统。

由于第2步,try_to_unmap解除了pte关系,因此我的问题也不存在了。

不知到的你的2次,3次age什么意思。晕了

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
15 [报告]
发表于 2013-06-06 12:49 |只看该作者
本帖最后由 embeddedlwp 于 2013-06-06 12:53 编辑

回复 14# blake326


age(老化),active => inactive => reclaim

我说的这个好像你没注意哈。
shrink anon active的时候,即使anon page的access/young bit被set了,仍然age到inactive list,只有VM_EXEC的file page会被照顾一下,因为这样桌面应用程序的response比较好
v3.10-rc4


   

论坛徽章:
0
16 [报告]
发表于 2013-06-06 13:35 |只看该作者
回复 15# embeddedlwp


看了3.9.4代码:

    static enum page_references page_check_references(struct page *page,
                                                  struct scan_control *sc)
{
        int referenced_ptes, referenced_page;
        unsigned long vm_flags;

        referenced_ptes = page_referenced(page, 1, sc->target_mem_cgroup,
                                          &vm_flags);
        referenced_page = TestClearPageReferenced(page);

        /*
         * Mlock lost the isolation race with us.  Let try_to_unmap()
         * move the page to the unevictable list.
         */
        if (vm_flags & VM_LOCKED)
                return PAGEREF_RECLAIM;

        if (referenced_ptes) {
                if (PageSwapBacked(page))
                        return PAGEREF_ACTIVATE;

                /*
                 * All mapped pages start out with page table
                 * references from the instantiating fault, so we need
                 * to look twice if a mapped file page is used more
                 * than once.
                 *
                 * Mark it and spare it for another trip around the
                 * inactive list.  Another page table reference will
                 * lead to its activation.
                 *
                 * Note: the mark is set for activated pages as well
                 * so that recently deactivated but used pages are
                 * quickly recovered.
                 */
                SetPageReferenced(page);

                if (referenced_page || referenced_ptes > 1)
                        return PAGEREF_ACTIVATE;

                /*
                 * Activate file-backed executable pages after first usage.
                 */
                if (vm_flags & VM_EXEC)
                        return PAGEREF_ACTIVATE;

                return PAGEREF_KEEP;
        }

        /* Reclaim if clean, defer dirty pages to writeback */
        if (referenced_page && !PageSwapBacked(page))
                return PAGEREF_RECLAIM_CLEAN;

        return PAGEREF_RECLAIM;
}


假设, shrink active anon 时, 如果page有相应的young pte。并且PageSwapBacked设置了,那么就会返回PAGEREF_ACTIVATE, 之后这个page会被重新加入到anon active lru中。
PG_swapbacked应该是设置的把。确页异常设置的。
void page_add_new_anon_rmap(struct page *page,
        struct vm_area_struct *vma, unsigned long address)
{
        VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end);
        SetPageSwapBacked(page);
        atomic_set(&page->_mapcount, 0); /* increment count (starts at -1) */
        if (!PageTransHuge(page))
                __inc_zone_page_state(page, NR_ANON_PAGES);
        else
                __inc_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES);
        __page_set_anon_rmap(page, vma, address, 1);
        if (page_evictable(page, vma))
                lru_cache_add_lru(page, LRU_ACTIVE_ANON);
        else
                add_page_to_unevictable_list(page);
}

论坛徽章:
0
17 [报告]
发表于 2013-06-06 13:40 |只看该作者
回复 15# embeddedlwp


另外针对这段代码的意思:
                    if (vm_flags & VM_EXEC)
                        return PAGEREF_ACTIVATE;

应该是对用户file map并且是可执行的线性区做的特殊处理,就是可执行代码page加入到active file lru中。同single mmap的page区分开来。

论坛徽章:
0
18 [报告]
发表于 2013-06-06 13:48 |只看该作者
回复 15# embeddedlwp


    还有一个问题确认下:
   已经在inactive anon lru中的anon page。这个时候通过try_to_unmap解除了所有的用户pte映射。那么没有什么东西再能激活这个page了把?

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
19 [报告]
发表于 2013-06-06 14:14 |只看该作者
回复 18# blake326

应该是。shrink_page_list中拿到了page lock,do_swap_page里面也要拿这个锁,那do_swap_page就等着。shrink_page_list持有这个lock,把anon page加到swap cache,然后unmap所有ptes,然后把page写道swap area,然后从swap cache删除page。之后才释放这个锁。do_swap_page拿到page lock后发现swap cache中并没有这个page,swapin这个page,然后添加到lru上。
   

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
20 [报告]
发表于 2013-06-06 14:15 |只看该作者
回复 17# blake326


    恩,跟我说的是一个意思。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP