免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6171 | 回复: 15
打印 上一主题 下一主题

[内存管理] swap_writepage函数 [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-26 21:28 |只看该作者 |倒序浏览
本帖最后由 embeddedlwp 于 2012-05-27 08:27 编辑

swap_writeapge函数调用remove_exclusive_swap_page函数将换出页从swap cache中移除


/*
* Work out if there are any other processes sharing this
* swap cache page. Free it if you can. Return success.
*/
int remove_exclusive_swap_page(struct page *page)
{
        int retval;
        struct swap_info_struct * p;
        swp_entry_t entry;

        BUG_ON(PagePrivate(page));
        BUG_ON(!PageLocked(page));

        if (!PageSwapCache(page))
                return 0;
        if (PageWriteback(page))
                return 0;

        if (page_count(page) != 2) /* 2: us + cache */
                return 0;

        entry.val = page_private(page);
        p = swap_info_get(entry);
        if (!p)
                return 0;

        /* Is the only swap cache user the cache itself? */
        retval = 0;
        if (p->swap_map[swp_offset(entry)] == 1) {
                /* Recheck the page count with the swapcache lock held.. */
                write_lock_irq(&swapper_space.tree_lock);
                if ((page_count(page) == 2) && !PageWriteback(page)) {
                        __delete_from_swap_cache(page);
                        SetPageDirty(page);
                        retval = 1;
                }
                write_unlock_irq(&swapper_space.tree_lock);
        }
        spin_unlock(&swap_lock);

        if (retval) {
                swap_free(entry);
                page_cache_release(page);
        }

        return retval;
}

为什么page设置了writeback标志不可以呢?
page的private字段保存换出页标识符在哪里设置的啊?

ULK3说:
swap_writepage函数所执行的主要步骤如下:
1.检查是否至少有一个用户态进程引用该页。如果没有,则从交换高速缓存删除该页,并返回0.这一检查之所以必须做,
因为一个进程可能会与PFRA发生竞争并在shrink_list()检查完后释放一页。


这个竞争过程是什么样子的,能不能具体说说?

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
2 [报告]
发表于 2012-05-27 10:41 |只看该作者
pg_writeback标志就是说:“有人正在回写该页,请匆打扰”。
private指向的entry会在 add_to_swap中设置。

我觉得就是说:比如一个进程引用了一个匿名页(仅该进程引用),在shrink_list检查时它还活着,但当要被换出时,它死了,则此时该页只有us+swap 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
3 [报告]
发表于 2012-05-27 11:02 |只看该作者
回复 2# firkraag


http://bbs.chinaunix.net/thread-3748154-1-1.html

3.4的代码对这里进行了改动,你怎么看?


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
4 [报告]
发表于 2012-05-27 11:47 |只看该作者
本帖最后由 firkraag 于 2012-05-27 14:52 编辑

3.4代码我在线看不到。
不过你说的那种改动,似乎从2.6.34左右就开始出现了。他们将swap_map从unsigned short缩减至了unisgned char型。并使用0x40(4那一位)来表示该页在swap cache中。 我觉得要是到了这里共享换出页的进程数==0,也就没有哪个进程还引用它了,就可以回收了。

论坛徽章:
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
5 [报告]
发表于 2012-05-27 14:49 |只看该作者
回复 4# firkraag


我说的那种改动与你说的“从unsigned short缩减至了unisgned char型”有关系吗?嘿嘿!


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
6 [报告]
发表于 2012-05-27 14:54 |只看该作者
贴子已修改。

论坛徽章:
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
7 [报告]
发表于 2012-05-27 15:20 |只看该作者
回复 4# firkraag

swap_map应该是一个数组啊,本身不是bitmap。为什么从unsigned short缩减到unisgned char型?
那么2.6.24中为什么“p->swap_map[swp_offset(entry)] == 1”还可以释放,也就是说有一个进程在共享该换出页?

BTW,你可以使用git,这样就可以在本地看不同版本的代码了!


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
8 [报告]
发表于 2012-05-27 15:36 |只看该作者
在网上看见了个patch,他们好像认为swap count不会太大。还用了其中的几位当了flag。
“==1”说明引用它的用户只有swap cache。

git的话,我那被填得差不多的苦B的小硬盘啊!我还是用lxr吧,想看什么既能快速定位,又不占硬盘。

论坛徽章:
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
9 [报告]
发表于 2012-05-27 16:01 |只看该作者
回复 8# firkraag

从我那个链接你可以看到
在3.4中
page_swapcount(page)是为0的
在2.6.24中
p->swap_map[swp_offset(entry)] == 1
page_count(page) == 2

还有swap_map应该就是指共享这个页的进程数,swap cache那个只是增加page count




   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
10 [报告]
发表于 2012-05-27 18:00 |只看该作者
回复 9# embeddedlwp

在ulk3的17.4.5.3. The swap_free( ) function一节中说,swap cache也是page slot的主人之一。
       在早期的(相对的)版本中,如2.6.25中:
       add_to_swap()->get_swap_page()->scan_swap_map()中会使找到的空slot的usage counter置1。
       在新近的(相对的)版本中,如3.3中:
       add_to_swap()->get_swap_page()->scan_swap_map()中会使找到的空slot的usage counter置为
       usage(SWAP_HAS_CACHE即0x40)。

可见新版本中,不再让swap cache也占用useage counter,而是用一位flag来表示。
        
                                                   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP