summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
e504f3f)
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>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
if (unlikely(!page))
goto out;
if (radix_tree_exception(page)) {
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;
}
if (!page_cache_get_speculative(page))
goto repeat;
continue;
if (radix_tree_exception(page)) {
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;
}
if (!page_cache_get_speculative(page))
}
if (!page_cache_get_speculative(page))
continue;
if (radix_tree_exception(page)) {
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.
}
if (!page_cache_get_speculative(page))
}
if (!page_cache_get_speculative(page))
continue;
if (radix_tree_exception(page)) {
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.
}
if (!page_cache_get_speculative(page))
}
if (!page_cache_get_speculative(page))
*/
page = find_get_page(mapping, pgoff);
#ifdef CONFIG_SWAP
*/
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);
if (radix_tree_exceptional_entry(page)) {
swp_entry_t swap = radix_to_swp_entry(page);
page = find_get_page(&swapper_space, swap.val);
if (unlikely(!page))
continue;
if (radix_tree_exception(page)) {
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;
}
if (!page_cache_get_speculative(page))
goto repeat;