[PATCH v9 73/96] mm/lru: Add folio_lru and folio_is_file_lru

From: Matthew Wilcox (Oracle)
Date: Wed May 05 2021 - 13:25:06 EST


Convert page_lru() to call folio_lru() and convert page_is_file_lru()
to call folio_is_file_lru(). All pages on the LRUs are folios (because
tail pages use the space for the LRU list as compound_head), so all
callers can be converted.

Saves 637 bytes of kernel text; no functions grow.

Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx>
---
include/linux/mm_inline.h | 44 ++++++++++++++++++++++++---------------
1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h
index 355ea1ee32bd..c03b12ea0b7b 100644
--- a/include/linux/mm_inline.h
+++ b/include/linux/mm_inline.h
@@ -6,22 +6,27 @@
#include <linux/swap.h>

/**
- * page_is_file_lru - should the page be on a file LRU or anon LRU?
- * @page: the page to test
+ * folio_is_file_lru - should the folio be on a file LRU or anon LRU?
+ * @folio: the folio to test
*
- * Returns 1 if @page is a regular filesystem backed page cache page or a lazily
- * freed anonymous page (e.g. via MADV_FREE). Returns 0 if @page is a normal
- * anonymous page, a tmpfs page or otherwise ram or swap backed page. Used by
- * functions that manipulate the LRU lists, to sort a page onto the right LRU
- * list.
+ * Returns 1 if @folio is a regular filesystem backed page cache folio
+ * or a lazily freed anonymous folio (e.g. via MADV_FREE). Returns 0 if
+ * @folio is a normal anonymous folio, a tmpfs folio or otherwise ram or
+ * swap backed folio. Used by functions that manipulate the LRU lists,
+ * to sort a folio onto the right LRU list.
*
* We would like to get this info without a page flag, but the state
- * needs to survive until the page is last deleted from the LRU, which
+ * needs to survive until the folio is last deleted from the LRU, which
* could be as far down as __page_cache_release.
*/
+static inline int folio_is_file_lru(struct folio *folio)
+{
+ return !folio_swapbacked(folio);
+}
+
static inline int page_is_file_lru(struct page *page)
{
- return !PageSwapBacked(page);
+ return folio_is_file_lru(page_folio(page));
}

static __always_inline void update_lru_size(struct lruvec *lruvec,
@@ -57,28 +62,33 @@ static __always_inline void __clear_page_lru_flags(struct page *page)
}

/**
- * page_lru - which LRU list should a page be on?
- * @page: the page to test
+ * folio_lru_list - which LRU list should a folio be on?
+ * @folio: the folio to test
*
- * Returns the LRU list a page should be on, as an index
+ * Returns the LRU list a folio should be on, as an index
* into the array of LRU lists.
*/
-static __always_inline enum lru_list page_lru(struct page *page)
+static __always_inline enum lru_list folio_lru_list(struct folio *folio)
{
enum lru_list lru;

- VM_BUG_ON_PAGE(PageActive(page) && PageUnevictable(page), page);
+ VM_BUG_ON_FOLIO(folio_active(folio) && folio_unevictable(folio), folio);

- if (PageUnevictable(page))
+ if (folio_unevictable(folio))
return LRU_UNEVICTABLE;

- lru = page_is_file_lru(page) ? LRU_INACTIVE_FILE : LRU_INACTIVE_ANON;
- if (PageActive(page))
+ lru = folio_is_file_lru(folio) ? LRU_INACTIVE_FILE : LRU_INACTIVE_ANON;
+ if (folio_active(folio))
lru += LRU_ACTIVE;

return lru;
}

+static __always_inline enum lru_list page_lru(struct page *page)
+{
+ return folio_lru_list(page_folio(page));
+}
+
static __always_inline void add_page_to_lru_list(struct page *page,
struct lruvec *lruvec)
{
--
2.30.2