免费注册 查看新帖 |

Chinaunix

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

page_referenced_one里的swap token问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-24 16:09 |只看该作者 |倒序浏览
page_referenced_one函数里有这么一个判断:
        if (mm != current->mm && !ignore_token && has_swap_token(mm))
                referenced++;
我不明白什么时候会出现mm != current->mm,为什么要加这个判断。请高手指点。

下面是page_referenced_one的源码(版本2.6.11)

static int page_referenced_one(struct page *page,
        struct vm_area_struct *vma, unsigned int *mapcount, int ignore_token)
{
        struct mm_struct *mm = vma->vm_mm;
        unsigned long address;
        pgd_t *pgd;
        pud_t *pud;
        pmd_t *pmd;
        pte_t *pte;
        int referenced = 0;

        if (!mm->rss)
                goto out;
        address = vma_address(page, vma);
        if (address == -EFAULT)
                goto out;

        spin_lock(&mm->page_table_lock);

        pgd = pgd_offset(mm, address);
        if (!pgd_present(*pgd))
                goto out_unlock;

        pud = pud_offset(pgd, address);
        if (!pud_present(*pud))
                goto out_unlock;

        pmd = pmd_offset(pud, address);
        if (!pmd_present(*pmd))
                goto out_unlock;

        pte = pte_offset_map(pmd, address);
        if (!pte_present(*pte))
                goto out_unmap;

        if (page_to_pfn(page) != pte_pfn(*pte))
                goto out_unmap;

        if (ptep_clear_flush_young(vma, address, pte))
                referenced++;

        if (mm != current->mm && !ignore_token && has_swap_token(mm))
                referenced++;

        (*mapcount)--;

out_unmap:
        pte_unmap(pte);
out_unlock:
        spin_unlock(&mm->page_table_lock);
out:
        return referenced;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP