- 论坛徽章:
- 16
|
回复 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,我哪里理解不对?
|
|