Loading mm/filemap.c +28 −35 Original line number Diff line number Diff line Loading @@ -1382,27 +1382,21 @@ EXPORT_SYMBOL(page_cache_prev_miss); */ struct page *find_get_entry(struct address_space *mapping, pgoff_t offset) { void **pagep; XA_STATE(xas, &mapping->i_pages, offset); struct page *head, *page; rcu_read_lock(); repeat: page = NULL; pagep = radix_tree_lookup_slot(&mapping->i_pages, offset); if (pagep) { page = radix_tree_deref_slot(pagep); if (unlikely(!page)) goto out; if (radix_tree_exception(page)) { if (radix_tree_deref_retry(page)) xas_reset(&xas); page = xas_load(&xas); if (xas_retry(&xas, page)) goto repeat; /* * A shadow entry of a recently evicted page, * or a swap entry from shmem/tmpfs. Return * it without attempting to raise page count. * A shadow entry of a recently evicted page, or a swap entry from * shmem/tmpfs. Return it without attempting to raise page count. */ if (!page || xa_is_value(page)) goto out; } head = compound_head(page); if (!page_cache_get_speculative(head)) Loading @@ -1419,11 +1413,10 @@ struct page *find_get_entry(struct address_space *mapping, pgoff_t offset) * This is part of the lockless pagecache protocol. See * include/linux/pagemap.h for details. */ if (unlikely(page != *pagep)) { if (unlikely(page != xas_reload(&xas))) { put_page(head); goto repeat; } } out: rcu_read_unlock(); Loading Loading @@ -1453,7 +1446,7 @@ struct page *find_lock_entry(struct address_space *mapping, pgoff_t offset) repeat: page = find_get_entry(mapping, offset); if (page && !radix_tree_exception(page)) { if (page && !xa_is_value(page)) { lock_page(page); /* Has the page been truncated? */ if (unlikely(page_mapping(page) != mapping)) { Loading Loading
mm/filemap.c +28 −35 Original line number Diff line number Diff line Loading @@ -1382,27 +1382,21 @@ EXPORT_SYMBOL(page_cache_prev_miss); */ struct page *find_get_entry(struct address_space *mapping, pgoff_t offset) { void **pagep; XA_STATE(xas, &mapping->i_pages, offset); struct page *head, *page; rcu_read_lock(); repeat: page = NULL; pagep = radix_tree_lookup_slot(&mapping->i_pages, offset); if (pagep) { page = radix_tree_deref_slot(pagep); if (unlikely(!page)) goto out; if (radix_tree_exception(page)) { if (radix_tree_deref_retry(page)) xas_reset(&xas); page = xas_load(&xas); if (xas_retry(&xas, page)) goto repeat; /* * A shadow entry of a recently evicted page, * or a swap entry from shmem/tmpfs. Return * it without attempting to raise page count. * A shadow entry of a recently evicted page, or a swap entry from * shmem/tmpfs. Return it without attempting to raise page count. */ if (!page || xa_is_value(page)) goto out; } head = compound_head(page); if (!page_cache_get_speculative(head)) Loading @@ -1419,11 +1413,10 @@ struct page *find_get_entry(struct address_space *mapping, pgoff_t offset) * This is part of the lockless pagecache protocol. See * include/linux/pagemap.h for details. */ if (unlikely(page != *pagep)) { if (unlikely(page != xas_reload(&xas))) { put_page(head); goto repeat; } } out: rcu_read_unlock(); Loading Loading @@ -1453,7 +1446,7 @@ struct page *find_lock_entry(struct address_space *mapping, pgoff_t offset) repeat: page = find_get_entry(mapping, offset); if (page && !radix_tree_exception(page)) { if (page && !xa_is_value(page)) { lock_page(page); /* Has the page been truncated? */ if (unlikely(page_mapping(page) != mapping)) { Loading