Let me share my thoughts from what I have read elsewhere (same concepts below applies to many other OS like Solaris too, where a lot of the memory concepts comes from) - in general understanding the principles so that u will not get lost in the codes...which can be buggy as well:<div>
<br></div><div>a.    COW:   the reason for this is to with efficiency and performance.   When u fork a process, the memory is shared between the parent and child process, but when the parent or child start writing to the memory, the sharing has to stop.   so that&#39;s the reason for &quot;copy on write&quot;.   most of the shared libraries are only for reading, so u can imagine the huge saving, since multiple processes will be having a single physical copy of library in memory.   </div>
<div><br></div><div>b.   Locking pages:   generally, if both parent and child are sharing the same page, then the page should have its write-protection enabled, so that there is no need to duplicate the page, and there is assurance of reading the page without fear of being modified.    but if either party want to write to it, then just make sure the page is first physically duplicated into another page and then lock is removed, and now u have two unlocked page accessible via two different process.   </div>
<div><br></div><div>make sense?   all those PTE stuff is just making sure that the page is readable from its respective process, as different process have different page table.</div><div><br></div><div>Just sidetracking a little, this concept is also applicable to filesystem.</div>
<div><br><div class="gmail_quote">On Sat, Sep 15, 2012 at 10:51 PM, Parmenides <span dir="ltr">&lt;<a href="mailto:mobile.parmenides@gmail.com" target="_blank">mobile.parmenides@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
The do_wp_page() implements the Copy-On-write approach. I have no idea<br>
about its doing concerning locked pages.<br>
<br>
static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,<br>
        unsigned long address, pte_t *page_table, pmd_t *pmd, pte_t pte)<br>
{<br>
<br>
        old_page = pfn_to_page(pfn);   &lt;-- old_page is in quesiton.<br>
<br>
        ... ... ...<br>
<br>
        if (!TestSetPageLocked(old_page)) {   &lt;-- We test the &#39;PG_locked&#39;<br>
flag of old_page.<br>
<br>
    If it is not set, we can further check whether<br>
<br>
    the page should be copied.<br>
<br>
                int reuse = can_share_swap_page(old_page);<br>
                unlock_page(old_page);<br>
                if (reuse) {                                   &lt;-- If only one<br>
process owns old_page, we should copy it.<br>
                        flush_cache_page(vma, address);<br>
                        entry = maybe_mkwrite(pte_mkyoung(pte_mkdirty(pte)),<br>
                                              vma);<br>
                        ptep_set_access_flags(vma, address, page_table, entry, 1);<br>
                        update_mmu_cache(vma, address, entry);<br>
                        pte_unmap(page_table);<br>
                        spin_unlock(&amp;mm-&gt;page_table_lock);<br>
                        return VM_FAULT_MINOR;<br>
                }<br>
        }<br>
        pte_unmap(page_table);<br>
<br>
        /*<br>
         * Ok, we need to copy. Oh, well..<br>
         */                                                   &lt;-- At this<br>
point, we should copy old_page.<br>
<br>
        ... ... ...<br>
}<br>
<br>
In conclusion, if old_page is locked or it is not locked and two or<br>
more  processes own old_page, we should copy it. I don&#39;t understand<br>
why a locked page must be copied regardless of how many processes own<br>
it. Why do we give a locked page a special consideration?<br>
<br>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Regards,<br>Peter Teoh<br>
</div>