mm/swap: Add folio_mark_accessed()

Convert mark_page_accessed() to folio_mark_accessed().  It already
operated on the entire compound page, but now we can avoid calling
compound_head quite so many times.  Shrinks the function from 424 bytes
to 295 bytes (shrinking by 129 bytes).  The compatibility wrapper is 30
bytes, plus the 8 bytes for the exported symbol means the kernel shrinks
by 91 bytes.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: David Howells <dhowells@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
Matthew Wilcox (Oracle) 2021-04-27 10:47:39 -04:00
parent f2d273927e
commit 76580b6529
3 changed files with 25 additions and 19 deletions

View File

@ -352,7 +352,8 @@ extern void lru_note_cost(struct lruvec *lruvec, bool file,
unsigned int nr_pages);
extern void lru_note_cost_page(struct page *);
extern void lru_cache_add(struct page *);
extern void mark_page_accessed(struct page *);
void mark_page_accessed(struct page *);
void folio_mark_accessed(struct folio *);
extern atomic_t lru_disable_count;

View File

@ -5,6 +5,7 @@
*/
#include <linux/pagemap.h>
#include <linux/swap.h>
struct address_space *page_mapping(struct page *page)
{
@ -41,3 +42,9 @@ bool page_mapped(struct page *page)
return folio_mapped(page_folio(page));
}
EXPORT_SYMBOL(page_mapped);
void mark_page_accessed(struct page *page)
{
folio_mark_accessed(page_folio(page));
}
EXPORT_SYMBOL(mark_page_accessed);

View File

@ -368,7 +368,7 @@ static void folio_activate(struct folio *folio)
}
#endif
static void __lru_cache_activate_page(struct page *page)
static void __lru_cache_activate_folio(struct folio *folio)
{
struct pagevec *pvec;
int i;
@ -389,8 +389,8 @@ static void __lru_cache_activate_page(struct page *page)
for (i = pagevec_count(pvec) - 1; i >= 0; i--) {
struct page *pagevec_page = pvec->pages[i];
if (pagevec_page == page) {
SetPageActive(page);
if (pagevec_page == &folio->page) {
folio_set_active(folio);
break;
}
}
@ -408,36 +408,34 @@ static void __lru_cache_activate_page(struct page *page)
* When a newly allocated page is not yet visible, so safe for non-atomic ops,
* __SetPageReferenced(page) may be substituted for mark_page_accessed(page).
*/
void mark_page_accessed(struct page *page)
void folio_mark_accessed(struct folio *folio)
{
page = compound_head(page);
if (!PageReferenced(page)) {
SetPageReferenced(page);
} else if (PageUnevictable(page)) {
if (!folio_test_referenced(folio)) {
folio_set_referenced(folio);
} else if (folio_test_unevictable(folio)) {
/*
* Unevictable pages are on the "LRU_UNEVICTABLE" list. But,
* this list is never rotated or maintained, so marking an
* evictable page accessed has no effect.
*/
} else if (!PageActive(page)) {
} else if (!folio_test_active(folio)) {
/*
* If the page is on the LRU, queue it for activation via
* lru_pvecs.activate_page. Otherwise, assume the page is on a
* pagevec, mark it active and it'll be moved to the active
* LRU on the next drain.
*/
if (PageLRU(page))
folio_activate(page_folio(page));
if (folio_test_lru(folio))
folio_activate(folio);
else
__lru_cache_activate_page(page);
ClearPageReferenced(page);
workingset_activation(page_folio(page));
__lru_cache_activate_folio(folio);
folio_clear_referenced(folio);
workingset_activation(folio);
}
if (page_is_idle(page))
clear_page_idle(page);
if (folio_test_idle(folio))
folio_clear_idle(folio);
}
EXPORT_SYMBOL(mark_page_accessed);
EXPORT_SYMBOL(folio_mark_accessed);
/**
* lru_cache_add - add a page to a page list