Commit 62f945b6 authored by Matthew Wilcox's avatar Matthew Wilcox
Browse files

shmem: Convert shmem_radix_tree_replace to XArray



Rename shmem_radix_tree_replace() to shmem_replace_entry() and
convert it to use the XArray API.

Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
parent 10bbd235
Loading
Loading
Loading
Loading
+8 −14
Original line number Diff line number Diff line
@@ -322,24 +322,20 @@ void shmem_uncharge(struct inode *inode, long pages)
}

/*
 * Replace item expected in radix tree by a new item, while holding tree lock.
 * Replace item expected in xarray by a new item, while holding xa_lock.
 */
static int shmem_radix_tree_replace(struct address_space *mapping,
static int shmem_replace_entry(struct address_space *mapping,
			pgoff_t index, void *expected, void *replacement)
{
	struct radix_tree_node *node;
	void __rcu **pslot;
	XA_STATE(xas, &mapping->i_pages, index);
	void *item;

	VM_BUG_ON(!expected);
	VM_BUG_ON(!replacement);
	item = __radix_tree_lookup(&mapping->i_pages, index, &node, &pslot);
	if (!item)
		return -ENOENT;
	item = xas_load(&xas);
	if (item != expected)
		return -ENOENT;
	__radix_tree_replace(&mapping->i_pages, node, pslot,
			     replacement, NULL);
	xas_store(&xas, replacement);
	return 0;
}

@@ -624,8 +620,7 @@ static int shmem_add_to_page_cache(struct page *page,
	} else if (!expected) {
		error = radix_tree_insert(&mapping->i_pages, index, page);
	} else {
		error = shmem_radix_tree_replace(mapping, index, expected,
								 page);
		error = shmem_replace_entry(mapping, index, expected, page);
	}

	if (!error) {
@@ -654,7 +649,7 @@ static void shmem_delete_from_page_cache(struct page *page, void *radswap)
	VM_BUG_ON_PAGE(PageCompound(page), page);

	xa_lock_irq(&mapping->i_pages);
	error = shmem_radix_tree_replace(mapping, page->index, page, radswap);
	error = shmem_replace_entry(mapping, page->index, page, radswap);
	page->mapping = NULL;
	mapping->nrpages--;
	__dec_node_page_state(page, NR_FILE_PAGES);
@@ -1578,8 +1573,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,
	 * a nice clean interface for us to replace oldpage by newpage there.
	 */
	xa_lock_irq(&swap_mapping->i_pages);
	error = shmem_radix_tree_replace(swap_mapping, swap_index, oldpage,
								   newpage);
	error = shmem_replace_entry(swap_mapping, swap_index, oldpage, newpage);
	if (!error) {
		__inc_node_page_state(newpage, NR_FILE_PAGES);
		__dec_node_page_state(oldpage, NR_FILE_PAGES);