Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8079b1c8 authored by Hugh Dickins's avatar Hugh Dickins Committed by Linus Torvalds
Browse files

mm: clarify the radix_tree exceptional cases



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: default avatarHugh Dickins <hughd@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e504f3fd
Loading
Loading
Loading
Loading
+44 −22
Original line number Diff line number Diff line
@@ -700,10 +700,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) */
			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;
@@ -838,16 +842,22 @@ repeat:
			continue;

		if (radix_tree_exception(page)) {
			if (radix_tree_exceptional_entry(page))
				continue;
			if (radix_tree_deref_retry(page)) {
				/*
			 * 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.
				 * 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;
			}
			/*
			 * 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().
			 */
			continue;
		}

		if (!page_cache_get_speculative(page))
			goto repeat;
@@ -904,15 +914,21 @@ repeat:
			continue;

		if (radix_tree_exception(page)) {
			if (radix_tree_exceptional_entry(page))
				break;
			if (radix_tree_deref_retry(page)) {
				/*
			 * 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.
				 * 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;
			}
			/*
			 * Otherwise, shmem/tmpfs must be storing a swap entry
			 * here as an exceptional entry: so stop looking for
			 * contiguous pages.
			 */
			break;
		}

		if (!page_cache_get_speculative(page))
			goto repeat;
@@ -973,14 +989,20 @@ repeat:
			continue;

		if (radix_tree_exception(page)) {
			BUG_ON(radix_tree_exceptional_entry(page));
			if (radix_tree_deref_retry(page)) {
				/*
			 * 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.
				 * 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;
			}
			/*
			 * This function is never used on a shmem/tmpfs
			 * mapping, so a swap entry won't be found here.
			 */
			BUG();
		}

		if (!page_cache_get_speculative(page))
			goto repeat;
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ static unsigned char mincore_page(struct address_space *mapping, pgoff_t pgoff)
	 */
	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);
+8 −4
Original line number Diff line number Diff line
@@ -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) */
			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;