mirror of https://gitee.com/openkylin/linux.git
mm: make pagecache tagged lookups return only head pages
Patch series "Overhaul multi-page lookups for THP", v4. This THP prep patchset changes several page cache iteration APIs to only return head pages. - It's only possible to tag head pages in the page cache, so only return head pages, not all their subpages. - Factor a lot of common code out of the various batch lookup routines - Add mapping_seek_hole_data() - Unify find_get_entries() and pagevec_lookup_entries() - Make find_get_entries only return head pages, like find_get_entry(). These are only loosely connected, but they seem to make sense together as a series. This patch (of 14): Pagecache tags are used for dirty page writeback. Since dirtiness is tracked on a per-THP basis, we only want to return the head page rather than each subpage of a tagged page. All the filesystems which use huge pages today are in-memory, so there are no tagged huge pages today. Link: https://lkml.kernel.org/r/20201112212641.27837-2-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Jan Kara <jack@suse.cz> Reviewed-by: William Kucharski <william.kucharski@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Cc: Hugh Dickins <hughd@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Yang Shi <yang.shi@linux.alibaba.com> Cc: Dave Chinner <dchinner@redhat.com> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
6fbd6cf85a
commit
c49f50d198
11
mm/filemap.c
11
mm/filemap.c
|
@ -2062,7 +2062,7 @@ unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t index,
|
|||
EXPORT_SYMBOL(find_get_pages_contig);
|
||||
|
||||
/**
|
||||
* find_get_pages_range_tag - find and return pages in given range matching @tag
|
||||
* find_get_pages_range_tag - Find and return head pages matching @tag.
|
||||
* @mapping: the address_space to search
|
||||
* @index: the starting page index
|
||||
* @end: The final page index (inclusive)
|
||||
|
@ -2070,8 +2070,9 @@ EXPORT_SYMBOL(find_get_pages_contig);
|
|||
* @nr_pages: the maximum number of pages
|
||||
* @pages: where the resulting pages are placed
|
||||
*
|
||||
* Like find_get_pages, except we only return pages which are tagged with
|
||||
* @tag. We update @index to index the next page for the traversal.
|
||||
* Like find_get_pages(), except we only return head pages which are tagged
|
||||
* with @tag. @index is updated to the index immediately after the last
|
||||
* page we return, ready for the next iteration.
|
||||
*
|
||||
* Return: the number of pages which were found.
|
||||
*/
|
||||
|
@ -2105,9 +2106,9 @@ unsigned find_get_pages_range_tag(struct address_space *mapping, pgoff_t *index,
|
|||
if (unlikely(page != xas_reload(&xas)))
|
||||
goto put_page;
|
||||
|
||||
pages[ret] = find_subpage(page, xas.xa_index);
|
||||
pages[ret] = page;
|
||||
if (++ret == nr_pages) {
|
||||
*index = xas.xa_index + 1;
|
||||
*index = page->index + thp_nr_pages(page);
|
||||
goto out;
|
||||
}
|
||||
continue;
|
||||
|
|
Loading…
Reference in New Issue