From: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx> Use xas_find_any() to scan the entries instead of doing a lookup from the top of the tree each time. Signed-off-by: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx> --- mm/filemap.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/mm/filemap.c b/mm/filemap.c index 1c03b0ea105e..accc350f9544 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1349,20 +1349,15 @@ int __lock_page_or_retry(struct page *page, struct mm_struct *mm, pgoff_t page_cache_next_hole(struct address_space *mapping, pgoff_t index, unsigned long max_scan) { - unsigned long i; - - for (i = 0; i < max_scan; i++) { - struct page *page; + XA_STATE(xas, index); - page = radix_tree_lookup(&mapping->pages, index); - if (!page || xa_is_value(page)) - break; - index++; - if (index == 0) + while (max_scan--) { + void *entry = xas_find_any(&mapping->pages, &xas); + if (!entry || xa_is_value(entry)) break; } - return index; + return xas.xa_index; } EXPORT_SYMBOL(page_cache_next_hole); -- 2.15.0