diff options
| author | Hugh Dickins <hughd@google.com> | 2011-08-03 16:21:28 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-03 14:25:24 -1000 | 
| commit | 8079b1c859c44f27d63da4951f5038a16589a563 (patch) | |
| tree | 677e77a4c9d3b9c33427196cb5f860ebcf530b15 /mm/filemap.c | |
| parent | e504f3fdd63d486d45b18009e5a65f2e329acb0a (diff) | |
| download | olio-linux-3.10-8079b1c859c44f27d63da4951f5038a16589a563.tar.xz olio-linux-3.10-8079b1c859c44f27d63da4951f5038a16589a563.zip  | |
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: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 66 | 
1 files changed, 44 insertions, 22 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 96778faf82d..645a080ba4d 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -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) */ -			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; @@ -838,15 +842,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)) @@ -904,14 +914,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)) @@ -973,13 +989,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))  |