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

Commit 4c7472c0 authored by Matthew Wilcox's avatar Matthew Wilcox
Browse files

page cache: Convert find_get_entry to XArray



Slightly shorter and simpler code.

Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
parent 5c024e6a
Loading
Loading
Loading
Loading
+28 −35
Original line number Diff line number Diff line
@@ -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))
@@ -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();

@@ -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)) {