Allow __follow_page to succeed when encountering a clean, writeable pte. Requires reintroduction of the direct page dirtying. Means get_user_pages doesn't have to drop the page_table_lock and enter the page fault handler for every clean, writeable pte it encounters (when being called for write). Signed-off-by: Nick Piggin Index: linux-2.6/mm/memory.c =================================================================== --- linux-2.6.orig/mm/memory.c +++ linux-2.6/mm/memory.c @@ -811,15 +811,18 @@ static struct page *__follow_page(struct pte = *ptep; pte_unmap(ptep); if (pte_present(pte)) { - if (write && !pte_dirty(pte)) + if (write && !pte_write(pte) && !pte_dirty(pte)) goto out; if (read && !pte_read(pte)) goto out; pfn = pte_pfn(pte); if (pfn_valid(pfn)) { page = pfn_to_page(pfn); - if (accessed) + if (accessed) { + if (write && !pte_dirty(pte)&& !PageDirty(page)) + set_page_dirty(page); mark_page_accessed(page); + } return page; } }