Hi,

The do_wp_page() implements the Copy-On-write approach. I have no idea
about its doing concerning locked pages.

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)
{

        old_page = pfn_to_page(pfn);   <-- old_page is in quesiton.

        ... ... ...

        if (!TestSetPageLocked(old_page)) {   <-- We test the 'PG_locked'
flag of old_page.

    If it is not set, we can further check whether

    the page should be copied.

                int reuse = can_share_swap_page(old_page);
                unlock_page(old_page);
                if (reuse) {                                   <-- If only one
process owns old_page, we should copy it.
                        flush_cache_page(vma, address);
                        entry = maybe_mkwrite(pte_mkyoung(pte_mkdirty(pte)),
                                              vma);
                        ptep_set_access_flags(vma, address, page_table, entry, 
1);
                        update_mmu_cache(vma, address, entry);
                        pte_unmap(page_table);
                        spin_unlock(&mm->page_table_lock);
                        return VM_FAULT_MINOR;
                }
        }
        pte_unmap(page_table);

        /*
         * Ok, we need to copy. Oh, well..
         */                                                   <-- At this
point, we should copy old_page.

        ... ... ...
}

In conclusion, if old_page is locked or it is not locked and two or
more  processes own old_page, we should copy it. I don't understand
why a locked page must be copied regardless of how many processes own
it. Why do we give a locked page a special consideration?

_______________________________________________
Kernelnewbies mailing list
[email protected]
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Reply via email to