forked from luck/tmp_suning_uos_patched
mm: remove worrying dead code from find_get_pages()
The radix_tree_deref_retry() case in find_get_pages() has a strange little excrescence, not seen in the other gang lookups: it looks like the start of an abandoned attempt to guarantee forward progress in a case that cannot arise. ret should always be 0 here: if it isn't, then going back to restart will leak references to pages already gotten. There used to be a comment saying nr_found is necessarily 1 here: that's not quite true, but the radix_tree_deref_retry() case is peculiar to the entry at index 0, when we race with it being moved out of the radix_tree root or back. Remove the worrisome two lines, add a brief comment here and in find_get_pages_contig() and find_get_pages_tag(), and a WARN_ON in find_get_pages() should it ever be seen elsewhere than at 0. Signed-off-by: Hugh Dickins <hughd@google.com> Cc: Nick Piggin <npiggin@kernel.dk> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Wu Fengguang <fengguang.wu@intel.com> Cc: Salman Qazi <sqazi@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
c033a93c0d
commit
9d8aa4ea85
18
mm/filemap.c
18
mm/filemap.c
|
@ -863,9 +863,13 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
|
|||
page = radix_tree_deref_slot((void **)pages[i]);
|
||||
if (unlikely(!page))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* This can only trigger when the entry at index 0 moves out
|
||||
* of or back to the root: none yet gotten, safe to restart.
|
||||
*/
|
||||
if (radix_tree_deref_retry(page)) {
|
||||
if (ret)
|
||||
start = pages[ret-1]->index;
|
||||
WARN_ON(start | i);
|
||||
goto restart;
|
||||
}
|
||||
|
||||
|
@ -915,6 +919,11 @@ unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t index,
|
|||
page = radix_tree_deref_slot((void **)pages[i]);
|
||||
if (unlikely(!page))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* This can only trigger when the entry at index 0 moves out
|
||||
* of or back to the root: none yet gotten, safe to restart.
|
||||
*/
|
||||
if (radix_tree_deref_retry(page))
|
||||
goto restart;
|
||||
|
||||
|
@ -975,6 +984,11 @@ unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
|
|||
page = radix_tree_deref_slot((void **)pages[i]);
|
||||
if (unlikely(!page))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* This can only trigger when the entry at index 0 moves out
|
||||
* of or back to the root: none yet gotten, safe to restart.
|
||||
*/
|
||||
if (radix_tree_deref_retry(page))
|
||||
goto restart;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user