From: Matthew Wilcox <mawil...@microsoft.com>

shmem_radix_tree_replace() is renamed to shmem_xa_replace() and
converted to use the XArray API.

Signed-off-by: Matthew Wilcox <mawil...@microsoft.com>
---
 mm/shmem.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index c5731bb954a1..fad6c9e7402e 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -321,24 +321,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_xa_replace(struct address_space *mapping,
                        pgoff_t index, void *expected, void *replacement)
 {
-       struct radix_tree_node *node;
-       void **pslot;
+       XA_STATE(xas, &mapping->pages, index);
        void *item;
 
        VM_BUG_ON(!expected);
        VM_BUG_ON(!replacement);
-       item = __radix_tree_lookup(&mapping->pages, index, &node, &pslot);
-       if (!item)
-               return -ENOENT;
+       item = xas_load(&xas);
        if (item != expected)
                return -ENOENT;
-       __radix_tree_replace(&mapping->pages, node, pslot,
-                            replacement, NULL);
+       xas_store(&xas, replacement);
        return 0;
 }
 
@@ -605,8 +601,7 @@ static int shmem_add_to_page_cache(struct page *page,
        } else if (!expected) {
                error = radix_tree_insert(&mapping->pages, index, page);
        } else {
-               error = shmem_radix_tree_replace(mapping, index, expected,
-                                                                page);
+               error = shmem_xa_replace(mapping, index, expected, page);
        }
 
        if (!error) {
@@ -635,7 +630,7 @@ static void shmem_delete_from_page_cache(struct page *page, 
void *radswap)
        VM_BUG_ON_PAGE(PageCompound(page), page);
 
        xa_lock_irq(&mapping->pages);
-       error = shmem_radix_tree_replace(mapping, page->index, page, radswap);
+       error = shmem_xa_replace(mapping, page->index, page, radswap);
        page->mapping = NULL;
        mapping->nrpages--;
        __dec_node_page_state(page, NR_FILE_PAGES);
@@ -1550,8 +1545,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->pages);
-       error = shmem_radix_tree_replace(swap_mapping, swap_index, oldpage,
-                                                                  newpage);
+       error = shmem_xa_replace(swap_mapping, swap_index, oldpage, newpage);
        if (!error) {
                __inc_node_page_state(newpage, NR_FILE_PAGES);
                __dec_node_page_state(oldpage, NR_FILE_PAGES);
-- 
2.15.0

Reply via email to