Patch "mm: multi-gen LRU: remove MM_LEAF_OLD and MM_NONLEAF_TOTAL stats" has been added to the 6.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mm: multi-gen LRU: remove MM_LEAF_OLD and MM_NONLEAF_TOTAL stats

to the 6.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mm-multi-gen-lru-remove-mm_leaf_old-and-mm_nonleaf_t.patch
and it can be found in the queue-6.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit fd4ecc890b00d30a50f93c6fa9e07fdf95eddb1b
Author: Yu Zhao <yuzhao@xxxxxxxxxx>
Date:   Sat Oct 19 01:29:38 2024 +0000

    mm: multi-gen LRU: remove MM_LEAF_OLD and MM_NONLEAF_TOTAL stats
    
    [ Upstream commit ddd6d8e975b171ea3f63a011a75820883ff0d479 ]
    
    Patch series "mm: multi-gen LRU: Have secondary MMUs participate in
    MM_WALK".
    
    Today, the MM_WALK capability causes MGLRU to clear the young bit from
    PMDs and PTEs during the page table walk before eviction, but MGLRU does
    not call the clear_young() MMU notifier in this case.  By not calling this
    notifier, the MM walk takes less time/CPU, but it causes pages that are
    accessed mostly through KVM / secondary MMUs to appear younger than they
    should be.
    
    We do call the clear_young() notifier today, but only when attempting to
    evict the page, so we end up clearing young/accessed information less
    frequently for secondary MMUs than for mm PTEs, and therefore they appear
    younger and are less likely to be evicted.  Therefore, memory that is
    *not* being accessed mostly by KVM will be evicted *more* frequently,
    worsening performance.
    
    ChromeOS observed a tab-open latency regression when enabling MGLRU with a
    setup that involved running a VM:
    
                    Tab-open latency histogram (ms)
    Version         p50     mean    p95     p99     max
    base            1315    1198    2347    3454    10319
    mglru           2559    1311    7399    12060   43758
    fix             1119    926     2470    4211    6947
    
    This series replaces the final non-selftest patchs from this series[1],
    which introduced a similar change (and a new MMU notifier) with KVM
    optimizations.  I'll send a separate series (to Sean and Paolo) for the
    KVM optimizations.
    
    This series also makes proactive reclaim with MGLRU possible for KVM
    memory.  I have verified that this functions correctly with the selftest
    from [1], but given that that test is a KVM selftest, I'll send it with
    the rest of the KVM optimizations later.  Andrew, let me know if you'd
    like to take the test now anyway.
    
    [1]: https://lore.kernel.org/linux-mm/20240926013506.860253-18-jthoughton@xxxxxxxxxx/
    
    This patch (of 2):
    
    The removed stats, MM_LEAF_OLD and MM_NONLEAF_TOTAL, are not very helpful
    and become more complicated to properly compute when adding
    test/clear_young() notifiers in MGLRU's mm walk.
    
    Link: https://lkml.kernel.org/r/20241019012940.3656292-1-jthoughton@xxxxxxxxxx
    Link: https://lkml.kernel.org/r/20241019012940.3656292-2-jthoughton@xxxxxxxxxx
    Fixes: bd74fdaea146 ("mm: multi-gen LRU: support page table walks")
    Signed-off-by: Yu Zhao <yuzhao@xxxxxxxxxx>
    Signed-off-by: James Houghton <jthoughton@xxxxxxxxxx>
    Cc: Axel Rasmussen <axelrasmussen@xxxxxxxxxx>
    Cc: David Matlack <dmatlack@xxxxxxxxxx>
    Cc: David Rientjes <rientjes@xxxxxxxxxx>
    Cc: David Stevens <stevensd@xxxxxxxxxx>
    Cc: Oliver Upton <oliver.upton@xxxxxxxxx>
    Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx>
    Cc: Sean Christopherson <seanjc@xxxxxxxxxx>
    Cc: Wei Xu <weixugc@xxxxxxxxxx>
    Cc: <stable@xxxxxxxxxxxxxxx>
    Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 1dc6248feb832..5f44d24ed9ffe 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -458,9 +458,7 @@ struct lru_gen_folio {
 
 enum {
 	MM_LEAF_TOTAL,		/* total leaf entries */
-	MM_LEAF_OLD,		/* old leaf entries */
 	MM_LEAF_YOUNG,		/* young leaf entries */
-	MM_NONLEAF_TOTAL,	/* total non-leaf entries */
 	MM_NONLEAF_FOUND,	/* non-leaf entries found in Bloom filters */
 	MM_NONLEAF_ADDED,	/* non-leaf entries added to Bloom filters */
 	NR_MM_STATS
diff --git a/mm/vmscan.c b/mm/vmscan.c
index b1f88638c5ab4..c6d9f5f4f6002 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -3376,7 +3376,6 @@ static bool walk_pte_range(pmd_t *pmd, unsigned long start, unsigned long end,
 			continue;
 
 		if (!pte_young(ptent)) {
-			walk->mm_stats[MM_LEAF_OLD]++;
 			continue;
 		}
 
@@ -3529,7 +3528,6 @@ static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end,
 			walk->mm_stats[MM_LEAF_TOTAL]++;
 
 			if (!pmd_young(val)) {
-				walk->mm_stats[MM_LEAF_OLD]++;
 				continue;
 			}
 
@@ -3541,8 +3539,6 @@ static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end,
 			continue;
 		}
 
-		walk->mm_stats[MM_NONLEAF_TOTAL]++;
-
 		if (!walk->force_scan && should_clear_pmd_young()) {
 			if (!pmd_young(val))
 				continue;
@@ -5231,11 +5227,11 @@ static void lru_gen_seq_show_full(struct seq_file *m, struct lruvec *lruvec,
 	for (tier = 0; tier < MAX_NR_TIERS; tier++) {
 		seq_printf(m, "            %10d", tier);
 		for (type = 0; type < ANON_AND_FILE; type++) {
-			const char *s = "   ";
+			const char *s = "xxx";
 			unsigned long n[3] = {};
 
 			if (seq == max_seq) {
-				s = "RT ";
+				s = "RTx";
 				n[0] = READ_ONCE(lrugen->avg_refaulted[type][tier]);
 				n[1] = READ_ONCE(lrugen->avg_total[type][tier]);
 			} else if (seq == min_seq[type] || NR_HIST_GENS > 1) {
@@ -5257,14 +5253,14 @@ static void lru_gen_seq_show_full(struct seq_file *m, struct lruvec *lruvec,
 
 	seq_puts(m, "                      ");
 	for (i = 0; i < NR_MM_STATS; i++) {
-		const char *s = "      ";
+		const char *s = "xxxx";
 		unsigned long n = 0;
 
 		if (seq == max_seq && NR_HIST_GENS == 1) {
-			s = "LOYNFA";
+			s = "TYFA";
 			n = READ_ONCE(mm_state->stats[hist][i]);
 		} else if (seq != max_seq && NR_HIST_GENS > 1) {
-			s = "loynfa";
+			s = "tyfa";
 			n = READ_ONCE(mm_state->stats[hist][i]);
 		}
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux