All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yu Zhao <yuzhao@google.com>
To: Andrew Morton <akpm@linux-foundation.org>,
	Hugh Dickins <hughd@google.com>,
	Alex Shi <alex.shi@linux.alibaba.com>
Cc: Michal Hocko <mhocko@kernel.org>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Vladimir Davydov <vdavydov.dev@gmail.com>,
	Roman Gushchin <guro@fb.com>, Vlastimil Babka <vbabka@suse.cz>,
	Matthew Wilcox <willy@infradead.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Yu Zhao <yuzhao@google.com>
Subject: [PATCH 06/11] mm: add __clear_page_lru_flags() to replace page_off_lru()
Date: Mon,  7 Dec 2020 15:09:44 -0700	[thread overview]
Message-ID: <20201207220949.830352-7-yuzhao@google.com> (raw)
In-Reply-To: <20201207220949.830352-1-yuzhao@google.com>

Similar to page_off_lru(), the new function does non-atomic clearing
of PageLRU() in addition to PageActive() and PageUnevictable(), on a
page that has no references left.

If PageActive() and PageUnevictable() are both set, refuse to clear
either and leave them to bad_page(). This is a behavior change that
is meant to help debug.

Signed-off-by: Yu Zhao <yuzhao@google.com>
---
 include/linux/mm_inline.h | 28 ++++++++++------------------
 mm/swap.c                 |  6 ++----
 mm/vmscan.c               |  3 +--
 3 files changed, 13 insertions(+), 24 deletions(-)

diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h
index ffacc6273678..ef3fd79222e5 100644
--- a/include/linux/mm_inline.h
+++ b/include/linux/mm_inline.h
@@ -61,27 +61,19 @@ static inline enum lru_list page_lru_base_type(struct page *page)
 }
 
 /**
- * page_off_lru - which LRU list was page on? clearing its lru flags.
- * @page: the page to test
- *
- * Returns the LRU list a page was on, as an index into the array of LRU
- * lists; and clears its Unevictable or Active flags, ready for freeing.
+ * __clear_page_lru_flags - clear page lru flags before releasing a page
+ * @page: the page that was on lru and now has a zero reference
  */
-static __always_inline enum lru_list page_off_lru(struct page *page)
+static __always_inline void __clear_page_lru_flags(struct page *page)
 {
-	enum lru_list lru;
+	__ClearPageLRU(page);
 
-	if (PageUnevictable(page)) {
-		__ClearPageUnevictable(page);
-		lru = LRU_UNEVICTABLE;
-	} else {
-		lru = page_lru_base_type(page);
-		if (PageActive(page)) {
-			__ClearPageActive(page);
-			lru += LRU_ACTIVE;
-		}
-	}
-	return lru;
+	/* this shouldn't happen, so leave the flags to bad_page() */
+	if (PageActive(page) && PageUnevictable(page))
+		return;
+
+	__ClearPageActive(page);
+	__ClearPageUnevictable(page);
 }
 
 /**
diff --git a/mm/swap.c b/mm/swap.c
index d55a0c27d804..a37c896a32b0 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -84,9 +84,8 @@ static void __page_cache_release(struct page *page)
 
 		lruvec = lock_page_lruvec_irqsave(page, &flags);
 		VM_BUG_ON_PAGE(!PageLRU(page), page);
-		__ClearPageLRU(page);
 		del_page_from_lru_list(page, lruvec);
-		page_off_lru(page);
+		__clear_page_lru_flags(page);
 		unlock_page_lruvec_irqrestore(lruvec, flags);
 	}
 	__ClearPageWaiters(page);
@@ -911,9 +910,8 @@ void release_pages(struct page **pages, int nr)
 				lock_batch = 0;
 
 			VM_BUG_ON_PAGE(!PageLRU(page), page);
-			__ClearPageLRU(page);
 			del_page_from_lru_list(page, lruvec);
-			page_off_lru(page);
+			__clear_page_lru_flags(page);
 		}
 
 		__ClearPageWaiters(page);
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 49451899037c..e6bdfdfa2da1 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1847,8 +1847,7 @@ static unsigned noinline_for_stack move_pages_to_lru(struct lruvec *lruvec,
 		SetPageLRU(page);
 
 		if (unlikely(put_page_testzero(page))) {
-			__ClearPageLRU(page);
-			__ClearPageActive(page);
+			__clear_page_lru_flags(page);
 
 			if (unlikely(PageCompound(page))) {
 				spin_unlock_irq(&lruvec->lru_lock);
-- 
2.29.2.576.ga3fc446d84-goog


  parent reply	other threads:[~2020-12-07 22:11 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-07 22:09 [PATCH 00/11] mm: lru related cleanups Yu Zhao
2020-12-07 22:09 ` Yu Zhao
2020-12-07 22:09 ` [PATCH 01/11] mm: use add_page_to_lru_list() Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-08  3:41   ` Alex Shi
2020-12-07 22:09 ` [PATCH 02/11] mm: shuffle lru list addition and deletion functions Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-07 22:09 ` [PATCH 03/11] mm: don't pass "enum lru_list" to lru list addition functions Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-08  8:14   ` Alex Shi
2020-12-08  8:24   ` Alex Shi
2020-12-07 22:09 ` [PATCH 04/11] mm: don't pass "enum lru_list" to trace_mm_lru_insertion() Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-08  8:46   ` Alex Shi
2020-12-07 22:09 ` [PATCH 05/11] mm: don't pass "enum lru_list" to del_page_from_lru_list() Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-07 22:09 ` Yu Zhao [this message]
2020-12-07 22:09   ` [PATCH 06/11] mm: add __clear_page_lru_flags() to replace page_off_lru() Yu Zhao
2020-12-07 22:09 ` [PATCH 07/11] mm: VM_BUG_ON lru page flags Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-07 22:24   ` Matthew Wilcox
2020-12-16  0:54     ` Yu Zhao
2020-12-16  0:59       ` Matthew Wilcox
2020-12-07 22:09 ` [PATCH 08/11] mm: fold page_lru_base_type() into its sole caller Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-08  9:02   ` Alex Shi
2020-12-07 22:09 ` [PATCH 09/11] mm: fold __update_lru_size() " Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-08  9:07   ` Alex Shi
2020-12-07 22:09 ` [PATCH 10/11] mm: make lruvec_lru_size() static Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-08  9:09   ` Alex Shi
2020-12-07 22:09 ` [PATCH 11/11] mm: enlarge the "int nr_pages" parameter of update_lru_size() Yu Zhao
2020-12-07 22:09   ` Yu Zhao
2020-12-08  9:15   ` Alex Shi
2020-12-14 21:50   ` Hugh Dickins
2020-12-14 21:50     ` Hugh Dickins
2020-12-16  0:18     ` Yu Zhao
2020-12-10  9:28 ` [PATCH 00/11] mm: lru related cleanups Alex Shi
2020-12-16  0:48   ` Yu Zhao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201207220949.830352-7-yuzhao@google.com \
    --to=yuzhao@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.shi@linux.alibaba.com \
    --cc=guro@fb.com \
    --cc=hannes@cmpxchg.org \
    --cc=hughd@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --cc=vbabka@suse.cz \
    --cc=vdavydov.dev@gmail.com \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.