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: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarDavid Howells <dhowells@redhat.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
parent f2d27392
...@@ -352,7 +352,8 @@ extern void lru_note_cost(struct lruvec *lruvec, bool file, ...@@ -352,7 +352,8 @@ extern void lru_note_cost(struct lruvec *lruvec, bool file,
unsigned int nr_pages); unsigned int nr_pages);
extern void lru_note_cost_page(struct page *); extern void lru_note_cost_page(struct page *);
extern void lru_cache_add(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; extern atomic_t lru_disable_count;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*/ */
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/swap.h>
struct address_space *page_mapping(struct page *page) struct address_space *page_mapping(struct page *page)
{ {
...@@ -41,3 +42,9 @@ bool page_mapped(struct page *page) ...@@ -41,3 +42,9 @@ bool page_mapped(struct page *page)
return folio_mapped(page_folio(page)); return folio_mapped(page_folio(page));
} }
EXPORT_SYMBOL(page_mapped); EXPORT_SYMBOL(page_mapped);
void mark_page_accessed(struct page *page)
{
folio_mark_accessed(page_folio(page));
}
EXPORT_SYMBOL(mark_page_accessed);
...@@ -368,7 +368,7 @@ static void folio_activate(struct folio *folio) ...@@ -368,7 +368,7 @@ static void folio_activate(struct folio *folio)
} }
#endif #endif
static void __lru_cache_activate_page(struct page *page) static void __lru_cache_activate_folio(struct folio *folio)
{ {
struct pagevec *pvec; struct pagevec *pvec;
int i; int i;
...@@ -389,8 +389,8 @@ static void __lru_cache_activate_page(struct page *page) ...@@ -389,8 +389,8 @@ static void __lru_cache_activate_page(struct page *page)
for (i = pagevec_count(pvec) - 1; i >= 0; i--) { for (i = pagevec_count(pvec) - 1; i >= 0; i--) {
struct page *pagevec_page = pvec->pages[i]; struct page *pagevec_page = pvec->pages[i];
if (pagevec_page == page) { if (pagevec_page == &folio->page) {
SetPageActive(page); folio_set_active(folio);
break; break;
} }
} }
...@@ -408,36 +408,34 @@ static void __lru_cache_activate_page(struct page *page) ...@@ -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, * 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). * __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 (!folio_test_referenced(folio)) {
folio_set_referenced(folio);
if (!PageReferenced(page)) { } else if (folio_test_unevictable(folio)) {
SetPageReferenced(page);
} else if (PageUnevictable(page)) {
/* /*
* Unevictable pages are on the "LRU_UNEVICTABLE" list. But, * Unevictable pages are on the "LRU_UNEVICTABLE" list. But,
* this list is never rotated or maintained, so marking an * this list is never rotated or maintained, so marking an
* evictable page accessed has no effect. * 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 * If the page is on the LRU, queue it for activation via
* lru_pvecs.activate_page. Otherwise, assume the page is on a * lru_pvecs.activate_page. Otherwise, assume the page is on a
* pagevec, mark it active and it'll be moved to the active * pagevec, mark it active and it'll be moved to the active
* LRU on the next drain. * LRU on the next drain.
*/ */
if (PageLRU(page)) if (folio_test_lru(folio))
folio_activate(page_folio(page)); folio_activate(folio);
else else
__lru_cache_activate_page(page); __lru_cache_activate_folio(folio);
ClearPageReferenced(page); folio_clear_referenced(folio);
workingset_activation(page_folio(page)); workingset_activation(folio);
} }
if (page_is_idle(page)) if (folio_test_idle(folio))
clear_page_idle(page); folio_clear_idle(folio);
} }
EXPORT_SYMBOL(mark_page_accessed); EXPORT_SYMBOL(folio_mark_accessed);
/** /**
* lru_cache_add - add a page to a page list * lru_cache_add - add a page to a page 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