mm/swap: Add folio_mark_accessed()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 27 Apr 2021 14:47:39 +0000 (10:47 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 18 Oct 2021 11:49:39 +0000 (07:49 -0400)
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>
include/linux/swap.h
mm/folio-compat.c
mm/swap.c

index 0fc84797623f3beb2d9f68daa6a69e60c1c07d45..067b7af5242cfcbaea04e86ab3b6714d38d1337f 100644 (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;
 
index 7044fcc8a8aa82729fec2e128f6e61dc1051f2e1..a374747ae1c6d5c931df6e240e388b2886cc0d66 100644 (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);
index 3860d6bc8c8a88b6a24d6b495c5b1046831ab4c2..b95fd6d057681b2d2b8356135ab24debeca77d7c 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -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