]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
shmem: Convert shmem_radix_tree_replace to XArray
authorMatthew Wilcox <willy@infradead.org>
Fri, 17 Nov 2017 15:22:37 +0000 (10:22 -0500)
committerMatthew Wilcox <willy@infradead.org>
Sun, 21 Oct 2018 14:46:39 +0000 (10:46 -0400)
Rename shmem_radix_tree_replace() to shmem_replace_entry() and
convert it to use the XArray API.

Signed-off-by: Matthew Wilcox <willy@infradead.org>
mm/shmem.c

index c1062760fe4147d5601023c9de3d559b0f771d40..5697c8fecdfcb747ee1e725d7751eaee44dab1f3 100644 (file)
@@ -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);