免费注册 查看新帖 |

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-27 20:37 |显示全部楼层
回复 18# firkraag

看ULK3上说“当页被换出时,其标志符就作为页的表项插入页表中,这样在需要时就可以再找到这个页”

我找遍了add_to_swap函数,也没找到哪里设置这个pte的啊?


   

论坛徽章:
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-27 20:59 |显示全部楼层
本帖最后由 embeddedlwp 于 2012-05-27 21:00 编辑

回复 17# 塑料袋

考虑两种情况:
1.一个进程的anon page要被PFRA swap out,已经调用了add_to_swap和try_to_unmap,但是swap cache中的page还没释放呢,此时进程要访问这个page啦,又要swap in,在swap cache里找到了page,填充了进程的pte,然后呢?shrink_page_list函数既然调用完了add_to_swap和try_to_unmap,接下如果页脏要写回,会从swap cache中删除page吗,还有这个pte被设置了,会再次调用try_to_unmap吗?
2.在add_to_swap函数中:

int add_to_swap(struct page * page, gfp_t gfp_mask)
{
        swp_entry_t entry;
        int err;

        BUG_ON(!PageLocked(page));

        for (;;) {
                entry = get_swap_page();
                if (!entry.val)
                        return 0;

                /*
                 * Radix-tree node allocations from PF_MEMALLOC contexts could
                 * completely exhaust the page allocator. __GFP_NOMEMALLOC
                 * stops emergency reserves from being allocated.
                 *
                 * TODO: this could cause a theoretical memory reclaim
                 * deadlock in the swap out path.
                 */
                /*
                 * Add it to the swap cache and mark it dirty
                 */
                err = __add_to_swap_cache(page, entry,
                                gfp_mask|__GFP_NOMEMALLOC|__GFP_NOWARN);

                switch (err) {
                case 0:                                /* Success */
                        SetPageUptodate(page);
                        SetPageDirty(page);
                        INC_CACHE_INFO(add_total);
                        return 1;
                case -EEXIST:
                        /* Raced with "speculative" read_swap_cache_async */
                        INC_CACHE_INFO(exist_race);
                        swap_free(entry);
                        continue;

                default:
                        /* -ENOMEM radix-tree allocation failure */
                        swap_free(entry);
                        return 0;
                }
        }
}

红色部分,发生啥race,抢锁?还是抢什么?找了半天没看到抢什么啊?



   

论坛徽章:
0
发表于 2012-05-27 21:13 |显示全部楼层
pdflush刷写过程

background_writeout—〉writeback_inodes—〉sync_sb_inodes—〉generic_sync_sb_inodes—〉__writeback_single_inode—〉
__sync_single_inode—〉do_writepages

如果此处ram disk 判断跳出的话,就不会执行以上代码。所以从sync inode分析刷写可以说明一定问题。

至于sb_is_blkdev_sb怎么判断是不是ramdisk,ramdisk没研究过,不清楚为什么这么判断。哪位大侠知道原因可以继续顶。

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-28 08:24 |显示全部楼层
回复 21# embeddedlwp
那个啊,是在try_to_unmap_one里设置的。
   

论坛徽章:
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-28 12:12 |显示全部楼层
回复 24# firkraag


When a page shared by several processes (this can be determined by referring to the usage
counter in the swap area) is read in from the swap area, the page is retained in both the
swap area and the swap cache until it is either swapped out again or until it is swapped
in by all the processes that share it.
The kernel implements this behavior by means of the
add_to_swap_cache function, which adds a page to the swap cache without performing oper-
ations on the swap areas themselves.


红色的部分怎么理解?
   

论坛徽章:
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-28 12:14 |显示全部楼层
回复 24# firkraag

sys_swapon函数中,要从radix tree中读入swap_header

这个swap_header是怎样产生的?是在mkswap的时候嘛?


   

论坛徽章:
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-28 12:31 |显示全部楼层
回复 24# firkraag

在sys_swapon函数中,如果判断这个inode对应的是一个普通文件,那么会接着判断这个文件是否已经设置了S_SWAPFILE,但是他只是check了一下有没有设置,如果没有设置,那么它并没有对这个标志进行设置啊?

if (S_ISBLK(inode->i_mode)) {
                bdev = I_BDEV(inode);
                error = bd_claim(bdev, sys_swapon);
                if (error < 0) {
                        bdev = NULL;
                        error = -EINVAL;
                        goto bad_swap;
                }
                p->old_block_size = block_size(bdev);,
                error = set_blocksize(bdev, PAGE_SIZE);
                if (error < 0)
                        goto bad_swap;
                p->bdev = bdev;
        } else if (S_ISREG(inode->i_mode)) {
                p->bdev = inode->i_sb->s_bdev;
                mutex_lock(&inode->i_mutex);
                did_down = 1;
                if (IS_SWAPFILE(inode)) {
                        error = -EBUSY;
                        goto bad_swap;
                }
        } else {
                goto bad_swap;
        }


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-28 12:47 |显示全部楼层
本帖最后由 firkraag 于 2012-05-28 12:47 编辑

回复 25# embeddedlwp

就是说,page在除了被完全换入或换出的两各情况下,它可以被在swap cache或交换区中取得。(当然发生page fault会在swap cache中先找的。)add_to_swap_cache只是将page加入到swap cache中,不对交换区进行操作。

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-28 13:02 |显示全部楼层
回复 27# embeddedlwp
在该函数的最后几行(大概1723-1727), inode->i_flags |= S_SWAPFILE;

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-28 13:06 |显示全部楼层
回复 26# embeddedlwp
应该是在mkswap写入文件的。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP