From: Hugh Dickins <hughd@google.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Pekka Enberg <penberg@kernel.org>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: [PATCH 3/3] mm: clarify the radix_tree exceptional cases
Date: Tue, 19 Jul 2011 15:56:55 -0700 (PDT) [thread overview]
Message-ID: <alpine.LSU.2.00.1107191554340.1593@sister.anvils> (raw)
In-Reply-To: <alpine.LSU.2.00.1107191549540.1593@sister.anvils>
Make the radix_tree exceptional cases, mostly in filemap.c, clearer.
It's hard to devise a suitable snappy name that illuminates the use
by shmem/tmpfs for swap, while keeping filemap/pagecache/radix_tree
generality. And akpm points out that /* radix_tree_deref_retry(page) */
comments look like calls that have been commented out for unknown reason.
Skirt the naming difficulty by rearranging these blocks to handle the
transient radix_tree_deref_retry(page) case first; then just explain
the remaining shmem/tmpfs swap case in a comment.
Signed-off-by: Hugh Dickins <hughd@google.com>
---
mm/filemap.c | 66 ++++++++++++++++++++++++++++++++-----------------
mm/mincore.c | 1
mm/shmem.c | 12 +++++---
3 files changed, 53 insertions(+), 26 deletions(-)
--- mmotm.orig/mm/filemap.c 2011-07-08 18:57:15.142704312 -0700
+++ mmotm/mm/filemap.c 2011-07-19 11:13:31.945882037 -0700
@@ -703,10 +703,14 @@ repeat:
if (unlikely(!page))
goto out;
if (radix_tree_exception(page)) {
- if (radix_tree_exceptional_entry(page))
- goto out;
- /* radix_tree_deref_retry(page) */
- goto repeat;
+ if (radix_tree_deref_retry(page))
+ goto repeat;
+ /*
+ * Otherwise, shmem/tmpfs must be storing a swap entry
+ * here as an exceptional entry: so return it without
+ * attempting to raise page count.
+ */
+ goto out;
}
if (!page_cache_get_speculative(page))
goto repeat;
@@ -841,15 +845,21 @@ repeat:
continue;
if (radix_tree_exception(page)) {
- if (radix_tree_exceptional_entry(page))
- continue;
+ if (radix_tree_deref_retry(page)) {
+ /*
+ * Transient condition which can only trigger
+ * when entry at index 0 moves out of or back
+ * to root: none yet gotten, safe to restart.
+ */
+ WARN_ON(start | i);
+ goto restart;
+ }
/*
- * radix_tree_deref_retry(page):
- * can only trigger when entry at index 0 moves out of
- * or back to root: none yet gotten, safe to restart.
+ * Otherwise, shmem/tmpfs must be storing a swap entry
+ * here as an exceptional entry: so skip over it -
+ * we only reach this from invalidate_mapping_pages().
*/
- WARN_ON(start | i);
- goto restart;
+ continue;
}
if (!page_cache_get_speculative(page))
@@ -907,14 +917,20 @@ repeat:
continue;
if (radix_tree_exception(page)) {
- if (radix_tree_exceptional_entry(page))
- break;
+ if (radix_tree_deref_retry(page)) {
+ /*
+ * Transient condition which can only trigger
+ * when entry at index 0 moves out of or back
+ * to root: none yet gotten, safe to restart.
+ */
+ goto restart;
+ }
/*
- * radix_tree_deref_retry(page):
- * can only trigger when entry at index 0 moves out of
- * or back to root: none yet gotten, safe to restart.
+ * Otherwise, shmem/tmpfs must be storing a swap entry
+ * here as an exceptional entry: so stop looking for
+ * contiguous pages.
*/
- goto restart;
+ break;
}
if (!page_cache_get_speculative(page))
@@ -976,13 +992,19 @@ repeat:
continue;
if (radix_tree_exception(page)) {
- BUG_ON(radix_tree_exceptional_entry(page));
+ if (radix_tree_deref_retry(page)) {
+ /*
+ * Transient condition which can only trigger
+ * when entry at index 0 moves out of or back
+ * to root: none yet gotten, safe to restart.
+ */
+ goto restart;
+ }
/*
- * radix_tree_deref_retry(page):
- * can only trigger when entry at index 0 moves out of
- * or back to root: none yet gotten, safe to restart.
+ * This function is never used on a shmem/tmpfs
+ * mapping, so a swap entry won't be found here.
*/
- goto restart;
+ BUG();
}
if (!page_cache_get_speculative(page))
--- mmotm.orig/mm/mincore.c 2011-07-08 18:57:15.174704475 -0700
+++ mmotm/mm/mincore.c 2011-07-19 11:13:31.949882063 -0700
@@ -72,6 +72,7 @@ static unsigned char mincore_page(struct
*/
page = find_get_page(mapping, pgoff);
#ifdef CONFIG_SWAP
+ /* shmem/tmpfs may return swap: account for swapcache page too. */
if (radix_tree_exceptional_entry(page)) {
swp_entry_t swap = radix_to_swp_entry(page);
page = find_get_page(&swapper_space, swap.val);
--- mmotm.orig/mm/shmem.c 2011-07-19 11:11:33.709295729 -0700
+++ mmotm/mm/shmem.c 2011-07-19 11:13:31.953882076 -0700
@@ -332,10 +332,14 @@ repeat:
if (unlikely(!page))
continue;
if (radix_tree_exception(page)) {
- if (radix_tree_exceptional_entry(page))
- goto export;
- /* radix_tree_deref_retry(page) */
- goto restart;
+ if (radix_tree_deref_retry(page))
+ goto restart;
+ /*
+ * Otherwise, we must be storing a swap entry
+ * here as an exceptional entry: so return it
+ * without attempting to raise page count.
+ */
+ goto export;
}
if (!page_cache_get_speculative(page))
goto repeat;
--
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/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
prev parent reply other threads:[~2011-07-19 22:57 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-19 22:51 [PATCH 0/3] mm: tmpfs radix_tree swap leftovers Hugh Dickins
2011-07-19 22:52 ` [PATCH 1/3] radix_tree: clean away saw_unset_tag leftovers Hugh Dickins
2011-07-19 22:54 ` [PATCH 2/3] tmpfs radix_tree: locate_item to speed up swapoff Hugh Dickins
2011-07-27 23:28 ` Andrew Morton
2011-07-28 1:54 ` Hugh Dickins
2011-07-28 9:26 ` Hugh Dickins
2011-07-19 22:56 ` Hugh Dickins [this message]
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=alpine.LSU.2.00.1107191554340.1593@sister.anvils \
--to=hughd@google.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=penberg@kernel.org \
/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