From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f175.google.com (mail-wi0-f175.google.com [209.85.212.175]) by kanga.kvack.org (Postfix) with ESMTP id 1C0426B0071 for ; Tue, 24 Feb 2015 08:59:53 -0500 (EST) Received: by mail-wi0-f175.google.com with SMTP id r20so25711365wiv.2 for ; Tue, 24 Feb 2015 05:59:52 -0800 (PST) Received: from mx2.suse.de (cantor2.suse.de. [195.135.220.15]) by mx.google.com with ESMTPS id 16si63900652wju.138.2015.02.24.05.59.51 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 24 Feb 2015 05:59:51 -0800 (PST) Date: Tue, 24 Feb 2015 14:59:49 +0100 From: Michal Hocko Subject: Re: [PATCH V5 4/4] mm: Refactor do_wp_page handling of shared vma into a function Message-ID: <20150224135949.GD15626@dhcp22.suse.cz> References: <1424612538-25889-1-git-send-email-raindel@mellanox.com> <1424612538-25889-5-git-send-email-raindel@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424612538-25889-5-git-send-email-raindel@mellanox.com> Sender: owner-linux-mm@kvack.org List-ID: To: Shachar Raindel Cc: linux-mm@kvack.org, kirill.shutemov@linux.intel.com, mgorman@suse.de, riel@redhat.com, ak@linux.intel.com, matthew.r.wilcox@intel.com, dave.hansen@linux.intel.com, n-horiguchi@ah.jp.nec.com, akpm@linux-foundation.org, torvalds@linux-foundation.org, haggaie@mellanox.com, aarcange@redhat.com, pfeiner@google.com, hannes@cmpxchg.org, sagig@mellanox.com, walken@google.com, Dave Hansen On Sun 22-02-15 15:42:18, Shachar Raindel wrote: > 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 > Acked-by: Linus Torvalds > Acked-by: Kirill A. Shutemov > Acked-by: Rik van Riel > Acked-by: Andi Kleen > Acked-by: Haggai Eran > Acked-by: Johannes Weiner > Cc: Mel Gorman > Cc: Matthew Wilcox > Cc: Dave Hansen > Cc: Naoya Horiguchi > Cc: Andrew Morton > Cc: Andrea Arcangeli > Cc: Peter Feiner > Cc: Michel Lespinasse Reviewed-by: Michal Hocko > --- > mm/memory.c | 86 ++++++++++++++++++++++++++++++++++--------------------------- > 1 file changed, 48 insertions(+), 38 deletions(-) > > diff --git a/mm/memory.c b/mm/memory.c > index a06e705..b246d22 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -2181,6 +2181,52 @@ oom: > 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 > @@ -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); > } > > /* > -- > 1.7.11.2 > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: email@kvack.org -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org