- 论坛徽章:
- 0
|
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;
}
|
|