Skip to content

Commit

Permalink
mm: refactor do_wp_page handling of shared vma into a function
Browse files Browse the repository at this point in the history
The do_wp_page function is extremely long.  Extract the logic for
handling a page belonging to a shared vma into a function of its own.

This helps the readability of the code, without doing any functional
change in it.

Signed-off-by: Shachar Raindel <[email protected]>
Acked-by: Linus Torvalds <[email protected]>
Acked-by: Kirill A. Shutemov <[email protected]>
Acked-by: Rik van Riel <[email protected]>
Acked-by: Andi Kleen <[email protected]>
Acked-by: Haggai Eran <[email protected]>
Acked-by: Johannes Weiner <[email protected]>
Cc: Mel Gorman <[email protected]>
Cc: Matthew Wilcox <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Naoya Horiguchi <[email protected]>
Cc: Andrea Arcangeli <[email protected]>
Cc: Peter Feiner <[email protected]>
Cc: Michel Lespinasse <[email protected]>
Reviewed-by: Michal Hocko <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
raindel-mellanox authored and torvalds committed Apr 14, 2015
1 parent 2f38ab2 commit 93e478d
Showing 1 changed file with 48 additions and 38 deletions.
86 changes: 48 additions & 38 deletions mm/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -2181,6 +2181,52 @@ static int wp_page_copy(struct mm_struct *mm, struct vm_area_struct *vma,
return VM_FAULT_OOM;
}

static int wp_page_shared(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long address, pte_t *page_table,
pmd_t *pmd, spinlock_t *ptl, pte_t orig_pte,
struct page *old_page)
__releases(ptl)
{
int page_mkwrite = 0;

page_cache_get(old_page);

/*
* Only catch write-faults on shared writable pages,
* read-only shared pages can get COWed by
* get_user_pages(.write=1, .force=1).
*/
if (vma->vm_ops && vma->vm_ops->page_mkwrite) {
int tmp;

pte_unmap_unlock(page_table, ptl);
tmp = do_page_mkwrite(vma, old_page, address);
if (unlikely(!tmp || (tmp &
(VM_FAULT_ERROR | VM_FAULT_NOPAGE)))) {
page_cache_release(old_page);
return tmp;
}
/*
* Since we dropped the lock we need to revalidate
* the PTE as someone else may have changed it. If
* they did, we just return, as we can count on the
* MMU to tell us if they didn't also make it writable.
*/
page_table = pte_offset_map_lock(mm, pmd, address,
&ptl);
if (!pte_same(*page_table, orig_pte)) {
unlock_page(old_page);
pte_unmap_unlock(page_table, ptl);
page_cache_release(old_page);
return 0;
}
page_mkwrite = 1;
}

return wp_page_reuse(mm, vma, address, page_table, ptl,
orig_pte, old_page, page_mkwrite, 1);
}

/*
* This routine handles present pages, when users try to write
* to a shared page. It is done by copying the page to a new address
Expand Down Expand Up @@ -2259,44 +2305,8 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
unlock_page(old_page);
} else if (unlikely((vma->vm_flags & (VM_WRITE|VM_SHARED)) ==
(VM_WRITE|VM_SHARED))) {
int page_mkwrite = 0;

page_cache_get(old_page);

/*
* Only catch write-faults on shared writable pages,
* read-only shared pages can get COWed by
* get_user_pages(.write=1, .force=1).
*/
if (vma->vm_ops && vma->vm_ops->page_mkwrite) {
int tmp;

pte_unmap_unlock(page_table, ptl);
tmp = do_page_mkwrite(vma, old_page, address);
if (unlikely(!tmp || (tmp &
(VM_FAULT_ERROR | VM_FAULT_NOPAGE)))) {
page_cache_release(old_page);
return tmp;
}
/*
* Since we dropped the lock we need to revalidate
* the PTE as someone else may have changed it. If
* they did, we just return, as we can count on the
* MMU to tell us if they didn't also make it writable.
*/
page_table = pte_offset_map_lock(mm, pmd, address,
&ptl);
if (!pte_same(*page_table, orig_pte)) {
unlock_page(old_page);
pte_unmap_unlock(page_table, ptl);
page_cache_release(old_page);
return 0;
}
page_mkwrite = 1;
}

return wp_page_reuse(mm, vma, address, page_table, ptl,
orig_pte, old_page, page_mkwrite, 1);
return wp_page_shared(mm, vma, address, page_table, pmd,
ptl, orig_pte, old_page);
}

/*
Expand Down

0 comments on commit 93e478d

Please sign in to comment.