Commit 988c69f1 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Linus Torvalds

mm: optimise put_pages_list()

Instead of calling put_page() one page at a time, pop pages off the list
if their refcount was too high and pass the remainder to
put_unref_page_list().  This should be a speed improvement, but I have
no measurements to support that.  Current callers do not care about
performance, but I hope to add some which do.

Link: https://lkml.kernel.org/r/20211007192138.561673-1-willy@infradead.orgSigned-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarAnthony Yznaga <anthony.yznaga@oracle.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 642929a2
...@@ -134,18 +134,27 @@ EXPORT_SYMBOL(__put_page); ...@@ -134,18 +134,27 @@ EXPORT_SYMBOL(__put_page);
* put_pages_list() - release a list of pages * put_pages_list() - release a list of pages
* @pages: list of pages threaded on page->lru * @pages: list of pages threaded on page->lru
* *
* Release a list of pages which are strung together on page.lru. Currently * Release a list of pages which are strung together on page.lru.
* used by read_cache_pages() and related error recovery code.
*/ */
void put_pages_list(struct list_head *pages) void put_pages_list(struct list_head *pages)
{ {
while (!list_empty(pages)) { struct page *page, *next;
struct page *victim;
victim = lru_to_page(pages); list_for_each_entry_safe(page, next, pages, lru) {
list_del(&victim->lru); if (!put_page_testzero(page)) {
put_page(victim); list_del(&page->lru);
continue;
}
if (PageHead(page)) {
list_del(&page->lru);
__put_compound_page(page);
continue;
}
/* Cannot be PageLRU because it's passed to us using the lru */
__ClearPageWaiters(page);
} }
free_unref_page_list(pages);
} }
EXPORT_SYMBOL(put_pages_list); EXPORT_SYMBOL(put_pages_list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment