All of lore.kernel.org
 help / color / mirror / Atom feed
From: "解 咏梅" <yongmeixie@hotmail.com>
To: "akpm@linux-foundation.org" <akpm@linux-foundation.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: 回复: [PATCH] mm:vmscan: fix extra adjustment for lruvec's nonresident_age in case of reactivation
Date: Mon, 20 Sep 2021 03:11:02 +0000	[thread overview]
Message-ID: <TYYP286MB11150F9D24DF4DEFF5D89F8DC5A09@TYYP286MB1115.JPNP286.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <TYCP286MB1108D012DA436CA72029ACA7C5DF9@TYCP286MB1108.JPNP286.PROD.OUTLOOK.COM>


[-- Attachment #1.1: Type: text/plain, Size: 3434 bytes --]

Sorry, list_move can cause some problem when deleting a entry not on list any more (AKA DEBUG_LIST in enabled)
I corrected the patch as the attached.

Best Regards,
Yongmei.
________________________________
发件人: Yongmei Xie <yongmeixie@hotmail.com>
发送时间: 2021年9月19日 23:25
收件人: akpm@linux-foundation.org <akpm@linux-foundation.org>; linux-mm@kvack.org <linux-mm@kvack.org>; linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org>
抄送: yongmeixie@hotmail.com <yongmeixie@hotmail.com>
主题: [PATCH] mm:vmscan: fix extra adjustment for lruvec's nonresident_age in case of reactivation

Before commit #31d8fcac, VM didn't increase nonresident_age (AKA inactive age for
file pages) in shrink_page_list. When putback_inactive_pages was converged with
move_pages_to_lru, both shrink_active_list and shrink_page_list use the same
function to handle move pages to the appropriate lru under lru lock's protection.

At those day, VM didn't increase nonresident_age for second chance promotion.
Commit #31d8fcac fix the problem. Definitely, we should account the activation
for second chance. But move_pages_to_lru is used in reactivation in active lru
as well for protecting code section. So I suggest to add another variable to
tell whether reactivation or not.

Signed-off-by: Yongmei Xie <yongmeixie@hotmail.com>
---
 mm/vmscan.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 74296c2d1fed..85ccafcd4912 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2152,7 +2152,8 @@ static int too_many_isolated(struct pglist_data *pgdat, int file,
  * Returns the number of pages moved to the given lruvec.
  */
 static unsigned int move_pages_to_lru(struct lruvec *lruvec,
-                                     struct list_head *list)
+                                     struct list_head *list,
+                                     bool reactivation)
 {
         int nr_pages, nr_moved = 0;
         LIST_HEAD(pages_to_free);
@@ -2203,7 +2204,7 @@ static unsigned int move_pages_to_lru(struct lruvec *lruvec,
                 add_page_to_lru_list(page, lruvec);
                 nr_pages = thp_nr_pages(page);
                 nr_moved += nr_pages;
-               if (PageActive(page))
+               if (PageActive(page) && !reactivation)
                         workingset_age_nonresident(lruvec, nr_pages);
         }

@@ -2281,7 +2282,7 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
         nr_reclaimed = shrink_page_list(&page_list, pgdat, sc, &stat, false);

         spin_lock_irq(&lruvec->lru_lock);
-       move_pages_to_lru(lruvec, &page_list);
+       move_pages_to_lru(lruvec, &page_list, false);

         __mod_node_page_state(pgdat, NR_ISOLATED_ANON + file, -nr_taken);
         item = current_is_kswapd() ? PGSTEAL_KSWAPD : PGSTEAL_DIRECT;
@@ -2418,8 +2419,8 @@ static void shrink_active_list(unsigned long nr_to_scan,
          */
         spin_lock_irq(&lruvec->lru_lock);

-       nr_activate = move_pages_to_lru(lruvec, &l_active);
-       nr_deactivate = move_pages_to_lru(lruvec, &l_inactive);
+       nr_activate = move_pages_to_lru(lruvec, &l_active, true);
+       nr_deactivate = move_pages_to_lru(lruvec, &l_inactive, false);
         /* Keep all free pages in l_active list */
         list_splice(&l_inactive, &l_active);

--
2.18.2


[-- Attachment #1.2: Type: text/html, Size: 6608 bytes --]

[-- Attachment #2: v2-0001-mm-vmscan-remove-unnecessary-lru-lock-unlock-lock.patch --]
[-- Type: application/octet-stream, Size: 2536 bytes --]

From d25dea3adb696454cc926b644566e055008d752a Mon Sep 17 00:00:00 2001
From: Yongmei Xie <yongmeixie@hotmail.com>
Date: Sun, 19 Sep 2021 22:57:50 +0800
Subject: [PATCH v2] mm:vmscan remove unnecessary lru lock unlock/lock pair

There's code redundant in move_pages_to_lru. When there're multiple of mlocked pages
or compound pages, the original implementation tries to unlock and then lock to handle
some exceptional case.

Signed-off-by: Yongmei Xie <yongmeixie@hotmail.com>
---
 mm/vmscan.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 74296c2d1fed..045ca34272c1 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2156,6 +2156,8 @@ static unsigned int move_pages_to_lru(struct lruvec *lruvec,
 {
 	int nr_pages, nr_moved = 0;
 	LIST_HEAD(pages_to_free);
+	LIST_HEAD(pages_to_putback);
+	LIST_HEAD(compound_pages_to_free);
 	struct page *page;
 
 	while (!list_empty(list)) {
@@ -2163,9 +2165,7 @@ static unsigned int move_pages_to_lru(struct lruvec *lruvec,
 		VM_BUG_ON_PAGE(PageLRU(page), page);
 		list_del(&page->lru);
 		if (unlikely(!page_evictable(page))) {
-			spin_unlock_irq(&lruvec->lru_lock);
-			putback_lru_page(page);
-			spin_lock_irq(&lruvec->lru_lock);
+			list_add(&page->lru, &pages_to_putback);
 			continue;
 		}
 
@@ -2185,11 +2185,9 @@ static unsigned int move_pages_to_lru(struct lruvec *lruvec,
 		if (unlikely(put_page_testzero(page))) {
 			__clear_page_lru_flags(page);
 
-			if (unlikely(PageCompound(page))) {
-				spin_unlock_irq(&lruvec->lru_lock);
-				destroy_compound_page(page);
-				spin_lock_irq(&lruvec->lru_lock);
-			} else
+			if (unlikely(PageCompound(page)))
+				list_add(&page->lru, &compound_pages_to_free);
+			else
 				list_add(&page->lru, &pages_to_free);
 
 			continue;
@@ -2207,6 +2205,24 @@ static unsigned int move_pages_to_lru(struct lruvec *lruvec,
 			workingset_age_nonresident(lruvec, nr_pages);
 	}
 
+	spin_unlock_irq(&lruvec->lru_lock);
+	/*
+	 * Putback as a batch to reduce unlock/lock pair for unevictable pages
+	 */
+	while (!list_empty(&pages_to_putback)) {
+		page = lru_to_page(&pages_to_putback);
+		putback_lru_page(page);
+	}
+
+	/*
+	 * Free compound page as a batch to reduce unnecessary unlock/lock
+	 */
+	while (!list_empty(&compound_pages_to_free)) {
+		page = lru_to_page(&compound_pages_to_free);
+		destroy_compound_page(page);
+	}
+	spin_lock_irq(&lruvec->lru_lock);
+
 	/*
 	 * To save our caller's stack, now use input list for pages to free.
 	 */
-- 
2.18.2


  reply	other threads:[~2021-09-20  3:11 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-19 15:25 [PATCH] mm:vmscan: fix extra adjustment for lruvec's nonresident_age in case of reactivation Yongmei Xie
2021-09-20  3:11 ` 解 咏梅 [this message]
2021-09-21 14:48 ` Johannes Weiner
     [not found]   ` <TYYP286MB11150330E283CC23CB16E40CC5A29@TYYP286MB1115.JPNP286.PROD.OUTLOOK.COM>
2021-10-01 16:43     ` 回复: " Johannes Weiner
     [not found]       ` <TYYP286MB1115E3D67A88FFF1BFB68996C5B19@TYYP286MB1115.JPNP286.PROD.OUTLOOK.COM>
2021-10-07 16:34         ` 回复: " Johannes Weiner

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=TYYP286MB11150F9D24DF4DEFF5D89F8DC5A09@TYYP286MB1115.JPNP286.PROD.OUTLOOK.COM \
    --to=yongmeixie@hotmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.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.