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

Slightly simpler and shorter code.

Signed-off-by: Matthew Wilcox <mawil...@microsoft.com>
---
 mm/filemap.c | 56 +++++++++++++++++++++-----------------------------------
 1 file changed, 21 insertions(+), 35 deletions(-)

diff --git a/mm/filemap.c b/mm/filemap.c
index f60f22867a1a..2172c9f9efb9 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1391,51 +1391,37 @@ EXPORT_SYMBOL(page_cache_prev_hole);
  */
 struct page *find_get_entry(struct address_space *mapping, pgoff_t offset)
 {
-       void **pagep;
+       XA_STATE(xas, offset);
        struct page *head, *page;
 
        rcu_read_lock();
 repeat:
-       page = NULL;
-       pagep = radix_tree_lookup_slot(&mapping->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))
-                               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.
-                        */
-                       goto out;
-               }
+       page = xas_load(&mapping->pages, &xas);
+       if (!page || xa_is_value(page))
+               goto out;
 
-               head = compound_head(page);
-               if (!page_cache_get_speculative(head))
-                       goto repeat;
+       head = compound_head(page);
+       if (!page_cache_get_speculative(head))
+               goto repeat;
 
-               /* The page was split under us? */
-               if (compound_head(page) != head) {
-                       put_page(head);
-                       goto repeat;
-               }
+       /* The page was split under us? */
+       if (compound_head(page) != head) {
+               put_page(head);
+               goto repeat;
+       }
 
-               /*
-                * Has the page moved?
-                * This is part of the lockless pagecache protocol. See
-                * include/linux/pagemap.h for details.
-                */
-               if (unlikely(page != *pagep)) {
-                       put_page(head);
-                       goto repeat;
-               }
+       /*
+        * Has the page moved?
+        * This is part of the lockless pagecache protocol. See
+        * include/linux/pagemap.h for details.
+        */
+       if (unlikely(page != xas_reload(&mapping->pages, &xas))) {
+               put_page(head);
+               goto repeat;
        }
+
 out:
        rcu_read_unlock();
-
        return page;
 }
 EXPORT_SYMBOL(find_get_entry);
-- 
2.15.0

Reply via email to