summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2017-09-07 01:21:18 +0200
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-07 02:27:26 +0200
commitd72dc8a25afc71ce90ee92bdd77550e9beb85d4d (patch)
treeda47df20fe7bd2672f8368a2545f82e17703820b /mm
parentfscache: remove unused ->now_uncached callback (diff)
downloadlinux-d72dc8a25afc71ce90ee92bdd77550e9beb85d4d.tar.xz
linux-d72dc8a25afc71ce90ee92bdd77550e9beb85d4d.zip
mm: make pagevec_lookup() update index
Make pagevec_lookup() (and underlying find_get_pages()) update index to the next page where iteration should continue. Most callers want this and also pagevec_lookup_tag() already does this. Link: http://lkml.kernel.org/r/20170726114704.7626-3-jack@suse.cz Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/filemap.c11
-rw-r--r--mm/swap.c5
2 files changed, 11 insertions, 5 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index dad935769055..ab9011408d81 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -403,7 +403,7 @@ bool filemap_range_has_page(struct address_space *mapping,
return false;
pagevec_init(&pvec, 0);
- if (!pagevec_lookup(&pvec, mapping, index, 1))
+ if (!pagevec_lookup(&pvec, mapping, &index, 1))
return false;
ret = (pvec.pages[0]->index <= end);
pagevec_release(&pvec);
@@ -1569,10 +1569,11 @@ export:
*
* The search returns a group of mapping-contiguous pages with ascending
* indexes. There may be holes in the indices due to not-present pages.
+ * We also update @start to index the next page for the traversal.
*
* find_get_pages() returns the number of pages which were found.
*/
-unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
+unsigned find_get_pages(struct address_space *mapping, pgoff_t *start,
unsigned int nr_pages, struct page **pages)
{
struct radix_tree_iter iter;
@@ -1583,7 +1584,7 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
return 0;
rcu_read_lock();
- radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
+ radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, *start) {
struct page *head, *page;
repeat:
page = radix_tree_deref_slot(slot);
@@ -1625,6 +1626,10 @@ repeat:
}
rcu_read_unlock();
+
+ if (ret)
+ *start = pages[ret - 1]->index + 1;
+
return ret;
}
diff --git a/mm/swap.c b/mm/swap.c
index 60b1d2a75852..4bffd1198ce5 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -957,12 +957,13 @@ void pagevec_remove_exceptionals(struct pagevec *pvec)
* reference against the pages in @pvec.
*
* The search returns a group of mapping-contiguous pages with ascending
- * indexes. There may be holes in the indices due to not-present pages.
+ * indexes. There may be holes in the indices due to not-present pages. We
+ * also update @start to index the next page for the traversal.
*
* pagevec_lookup() returns the number of pages which were found.
*/
unsigned pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
- pgoff_t start, unsigned nr_pages)
+ pgoff_t *start, unsigned nr_pages)
{
pvec->nr = find_get_pages(mapping, start, nr_pages, pvec->pages);
return pagevec_count(pvec);