- 论坛徽章:
- 0
|
而在2.6.12的do_wp_page中,则在分配page页后,增加使用计数的地方
- static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,
- unsigned long address, pte_t *page_table, pmd_t *pmd, pte_t pte)
- {
- struct page *old_page, *new_page;
- unsigned long pfn = pte_pfn(pte);
- pte_t entry;
- /*
- * Ok, we need to copy. Oh, well..
- */
- if (!PageReserved(old_page))
- page_cache_get(old_page);
- spin_unlock(&mm->page_table_lock);
- if (unlikely(anon_vma_prepare(vma)))
- goto no_new_page;
- if (old_page == ZERO_PAGE(address)) {
- new_page = alloc_zeroed_user_highpage(vma, address);
- if (!new_page)
- goto no_new_page;
- } else {
- new_page = alloc_page_vma(GFP_HIGHUSER, vma, address);
- if (!new_page)
- goto no_new_page;
- copy_user_highpage(new_page, old_page, address);
- }
- /*
- * Re-check the pte - we dropped the lock
- */
- spin_lock(&mm->page_table_lock);
- page_table = pte_offset_map(pmd, address);
- if (likely(pte_same(*page_table, pte))) {
- if (PageAnon(old_page))
- dec_mm_counter(mm, anon_rss);
- if (PageReserved(old_page))
- inc_mm_counter(mm, rss);
- else
- page_remove_rmap(old_page);
- flush_cache_page(vma, address, pfn);
- break_cow(vma, new_page, address, page_table);
- [color=Red]lru_cache_add_active(new_page);[/color]
- page_add_anon_rmap(new_page, vma, address);
- /* Free the old page.. */
- new_page = old_page;
- }
- pte_unmap(page_table);
- page_cache_release(new_page);
- page_cache_release(old_page);
- spin_unlock(&mm->page_table_lock);
- return VM_FAULT_MINOR;
- no_new_page:
- page_cache_release(old_page);
- return VM_FAULT_OOM;
- }
- void fastcall lru_cache_add_active(struct page *page)
- {
- struct pagevec *pvec = &get_cpu_var(lru_add_active_pvecs);
- [color=Red]page_cache_get(page);[/color]
- if (!pagevec_add(pvec, page))
- __pagevec_lru_add_active(pvec);
- put_cpu_var(lru_add_active_pvecs);
- }
复制代码 |
|