Skip to content

Commit

Permalink
mm: improve find_lock_page
Browse files Browse the repository at this point in the history
find_lock_page does not need to recheck ->index because if the page is in the
right mapping then the index must be the same.  Also, tree_lock does not need
to be retaken after the page is locked in order to test that ->mapping has not
changed, because holding the page lock pins its mapping.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Nick Piggin authored and Linus Torvalds committed Oct 16, 2007
1 parent 0012818 commit 45726cb
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions mm/filemap.c
Original file line number Diff line number Diff line change
Expand Up @@ -621,26 +621,27 @@ struct page *find_lock_page(struct address_space *mapping,
{
struct page *page;

read_lock_irq(&mapping->tree_lock);
repeat:
read_lock_irq(&mapping->tree_lock);
page = radix_tree_lookup(&mapping->page_tree, offset);
if (page) {
page_cache_get(page);
if (TestSetPageLocked(page)) {
read_unlock_irq(&mapping->tree_lock);
__lock_page(page);
read_lock_irq(&mapping->tree_lock);

/* Has the page been truncated while we slept? */
if (unlikely(page->mapping != mapping ||
page->index != offset)) {
if (unlikely(page->mapping != mapping)) {
unlock_page(page);
page_cache_release(page);
goto repeat;
}
VM_BUG_ON(page->index != offset);
goto out;
}
}
read_unlock_irq(&mapping->tree_lock);
out:
return page;
}
EXPORT_SYMBOL(find_lock_page);
Expand Down

0 comments on commit 45726cb

Please sign in to comment.