From: Shachar Raindel <raindel@mellanox.com>
To: linux-mm@kvack.org
Cc: 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,
raindel@mellanox.com, Dave Hansen <dave.hansen@intel.com>
Subject: [PATCH V4 2/4] mm: Refactor do_wp_page - rewrite the unlock flow
Date: Sun, 22 Feb 2015 14:47:19 +0200 [thread overview]
Message-ID: <1424609241-20106-3-git-send-email-raindel@mellanox.com> (raw)
In-Reply-To: <1424609241-20106-1-git-send-email-raindel@mellanox.com>
When do_wp_page is ending, in several cases it needs to unlock the
pages and ptls it was accessing.
Currently, this logic was "called" by using a goto jump. This makes
following the control flow of the function harder. Readability was
further hampered by the unlock case containing large amount of logic
needed only in one of the 3 cases.
Using goto for cleanup is generally allowed. However, moving the
trivial unlocking flows to the relevant call sites allow deeper
refactoring in the next patch.
Signed-off-by: Shachar Raindel <raindel@mellanox.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: Rik van Riel <riel@redhat.com>
Acked-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Haggai Eran <haggaie@mellanox.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Matthew Wilcox <matthew.r.wilcox@intel.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Peter Feiner <pfeiner@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michel Lespinasse <walken@google.com>
---
mm/memory.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/mm/memory.c b/mm/memory.c
index 4ffcd57e..4604c85 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2067,7 +2067,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
{
struct page *old_page, *new_page = NULL;
pte_t entry;
- int ret = 0;
+ int page_copied = 0;
unsigned long mmun_start = 0; /* For mmu_notifiers */
unsigned long mmun_end = 0; /* For mmu_notifiers */
struct mem_cgroup *memcg;
@@ -2102,7 +2102,9 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
&ptl);
if (!pte_same(*page_table, orig_pte)) {
unlock_page(old_page);
- goto unlock;
+ pte_unmap_unlock(page_table, ptl);
+ page_cache_release(old_page);
+ return 0;
}
page_cache_release(old_page);
}
@@ -2148,7 +2150,9 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
&ptl);
if (!pte_same(*page_table, orig_pte)) {
unlock_page(old_page);
- goto unlock;
+ pte_unmap_unlock(page_table, ptl);
+ page_cache_release(old_page);
+ return 0;
}
page_mkwrite = 1;
}
@@ -2246,29 +2250,28 @@ gotten:
/* Free the old page.. */
new_page = old_page;
- ret |= VM_FAULT_WRITE;
+ page_copied = 1;
} else
mem_cgroup_cancel_charge(new_page, memcg);
if (new_page)
page_cache_release(new_page);
-unlock:
+
pte_unmap_unlock(page_table, ptl);
- if (mmun_end > mmun_start)
- mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);
+ mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);
if (old_page) {
/*
* Don't let another task, with possibly unlocked vma,
* keep the mlocked page.
*/
- if ((ret & VM_FAULT_WRITE) && (vma->vm_flags & VM_LOCKED)) {
+ if (page_copied && (vma->vm_flags & VM_LOCKED)) {
lock_page(old_page); /* LRU manipulation */
munlock_vma_page(old_page);
unlock_page(old_page);
}
page_cache_release(old_page);
}
- return ret;
+ return page_copied ? VM_FAULT_WRITE : 0;
oom_free_new:
page_cache_release(new_page);
oom:
--
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: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2015-02-22 12:47 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-22 12:47 [PATCH V4 0/4] Refactor do_wp_page, no functional change Shachar Raindel
2015-02-22 12:47 ` [PATCH V4 1/4] mm: Refactor do_wp_page, extract the reuse case Shachar Raindel
2015-02-22 13:09 ` Johannes Weiner
2015-02-22 12:47 ` Shachar Raindel [this message]
2015-02-22 13:19 ` [PATCH V4 2/4] mm: Refactor do_wp_page - rewrite the unlock flow Johannes Weiner
2015-02-22 12:47 ` [PATCH V4 3/4] mm: refactor do_wp_page, extract the page copy flow Shachar Raindel
2015-02-22 13:24 ` Johannes Weiner
2015-02-22 12:47 ` [PATCH V4 4/4] mm: Refactor do_wp_page handling of shared vma into a function Shachar Raindel
2015-02-22 13:28 ` Johannes Weiner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1424609241-20106-3-git-send-email-raindel@mellanox.com \
--to=raindel@mellanox.com \
--cc=aarcange@redhat.com \
--cc=ak@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=haggaie@mellanox.com \
--cc=hannes@cmpxchg.org \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-mm@kvack.org \
--cc=matthew.r.wilcox@intel.com \
--cc=mgorman@suse.de \
--cc=n-horiguchi@ah.jp.nec.com \
--cc=pfeiner@google.com \
--cc=riel@redhat.com \
--cc=sagig@mellanox.com \
--cc=torvalds@linux-foundation.org \
--cc=walken@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox