免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: embeddedlwp

[内存管理] page cache问题 [复制链接]

论坛徽章:
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
发表于 2012-05-30 18:46 |显示全部楼层
本帖最后由 embeddedlwp 于 2012-05-30 18:47 编辑

回复 90# firkraag

多谢!


   

论坛徽章:
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
发表于 2012-05-31 08:25 |显示全部楼层
回复 70# firkraag


我觉得就是在页错误之前,将pte的dirty置1.

======================

这个有什么用?


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-31 09:33 |显示全部楼层
回复 92# embeddedlwp
pte中dirty置位,且不在内存中(present位为0)的页是Non-Linear Memory Mappings的。


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-31 09:34 |显示全部楼层
回复 91# embeddedlwp
不客气。

   

论坛徽章:
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
发表于 2012-05-31 09:36 |显示全部楼层
回复 64# firkraag

在do_wp_page函数中有这么一句:

if (PageAnon(old_page)) {
                if (!TestSetPageLocked(old_page)) {
                        reuse = can_share_swap_page(old_page);
                        unlock_page(old_page);
                }

1609        if (reuse) {
1610                flush_cache_page(vma, address, pte_pfn(orig_pte));
1611                entry = pte_mkyoung(orig_pte);
1612                entry = maybe_mkwrite(pte_mkdirty(entry), vma);
1613                if (ptep_set_access_flags(vma, address, page_table, entry,1))
1614                        update_mmu_cache(vma, address, entry);
1615                ret |= VM_FAULT_WRITE;
1616                goto unlock;
1617        }

330int can_share_swap_page(struct page *page)
331{
332        int count;
333
334        BUG_ON(!PageLocked(page));
335        count = page_mapcount(page);
336        if (count <= 1 && PageSwapCache(page))
337                count += page_swapcount(page);
338        return count == 1;
339}

也就是说如果只有swap cache拥有这个page,那么就不重新分配一页了。

问题一:为什么写swap cache中的page 会触发page fault->do_wp_page(),swap cache的页都设置成了write protect ?
问题二:从can_share_swap_page函数来看,如果只有swap cache拥有该页,page_mapcount返回的一定是0,
              page_swapcount返回的也是0,那么count为0,can_share_swap_page返回的竟然是false,我哪里理解不对?
   

论坛徽章:
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
发表于 2012-05-31 09:43 |显示全部楼层
回复 93# firkraag

prefaulting

我是说这东东有啥特殊用途没?


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-31 09:49 |显示全部楼层
回复 96# embeddedlwp
因为是Non-Linear Memory Mappings所以要在发生页错误之前对它进行一些处理,所以就是prefaulting(页错误之前)的。

   

论坛徽章:
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
发表于 2012-05-31 09:57 |显示全部楼层
回复 97# firkraag

因为是Non-Linear Memory Mappings所以要在发生页错误之前对它进行一些处理,所以就是prefaulting(页错误之前)的。

=======================================================

能具体说说需要做啥处理啊,或者在哪个函数中做的这个处理(我指你说的page fault之前)?


   

论坛徽章:
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
发表于 2012-05-31 10:18 |显示全部楼层
回复 79# firkraag

此处是缺页,而且缺的是anon的页,不是cow或filemap,不用读入数据。我看好像干脆就vma属性设置了。

=========================================

什么时候会触发do_anonymous_page呢?如果是因为anon page被换出了,那么应该调用的是do_swap_page才对啊,
如果是write protect导致的anon page的page fault,走do_wp_page才对啊,还有什么情况会导致走do_anonymous_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
发表于 2012-05-31 10:22 |显示全部楼层
回复 97# firkraag

do_wp_page函数的这段:

1563        if (PageAnon(old_page)) {
1564                if (!TestSetPageLocked(old_page)) {
1565                        reuse = can_share_swap_page(old_page);
1566                        unlock_page(old_page);
1567                }
1568        } else if (unlikely((vma->vm_flags & (VM_WRITE|VM_SHARED)) ==
1569                                        (VM_WRITE|VM_SHARED))) {


怎么VM_WRITE|VM_SHARED也会导致 COW的page fault ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP