]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
page cache: Convert find_get_entries to XArray
authorMatthew Wilcox <willy@infradead.org>
Wed, 16 May 2018 21:20:45 +0000 (17:20 -0400)
committerMatthew Wilcox <willy@infradead.org>
Sun, 21 Oct 2018 14:46:34 +0000 (10:46 -0400)
Slightly shorter and simpler code.

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

index 2bf9f0742082ac0a798531e1db079f26fb9ce862..4707156b9fbd81f474f4e76c6de6b593ad5a9027 100644 (file)
@@ -1578,53 +1578,48 @@ unsigned find_get_entries(struct address_space *mapping,
                          pgoff_t start, unsigned int nr_entries,
                          struct page **entries, pgoff_t *indices)
 {
-       void **slot;
+       XA_STATE(xas, &mapping->i_pages, start);
+       struct page *page;
        unsigned int ret = 0;
-       struct radix_tree_iter iter;
 
        if (!nr_entries)
                return 0;
 
        rcu_read_lock();
-       radix_tree_for_each_slot(slot, &mapping->i_pages, &iter, start) {
-               struct page *head, *page;
-repeat:
-               page = radix_tree_deref_slot(slot);
-               if (unlikely(!page))
+       xas_for_each(&xas, page, ULONG_MAX) {
+               struct page *head;
+               if (xas_retry(&xas, page))
                        continue;
-               if (radix_tree_exception(page)) {
-                       if (radix_tree_deref_retry(page)) {
-                               slot = radix_tree_iter_retry(&iter);
-                               continue;
-                       }
-                       /*
-                        * A shadow entry of a recently evicted page, a swap
-                        * entry from shmem/tmpfs or a DAX entry.  Return it
-                        * without attempting to raise page count.
-                        */
+               /*
+                * A shadow entry of a recently evicted page, a swap
+                * entry from shmem/tmpfs or a DAX entry.  Return it
+                * without attempting to raise page count.
+                */
+               if (xa_is_value(page))
                        goto export;
-               }
 
                head = compound_head(page);
                if (!page_cache_get_speculative(head))
-                       goto repeat;
+                       goto retry;
 
                /* The page was split under us? */
-               if (compound_head(page) != head) {
-                       put_page(head);
-                       goto repeat;
-               }
+               if (compound_head(page) != head)
+                       goto put_page;
 
                /* Has the page moved? */
-               if (unlikely(page != *slot)) {
-                       put_page(head);
-                       goto repeat;
-               }
+               if (unlikely(page != xas_reload(&xas)))
+                       goto put_page;
+
 export:
-               indices[ret] = iter.index;
+               indices[ret] = xas.xa_index;
                entries[ret] = page;
                if (++ret == nr_entries)
                        break;
+               continue;
+put_page:
+               put_page(head);
+retry:
+               xas_reset(&xas);
        }
        rcu_read_unlock();
        return ret;