[PATCH 9/9] mm/mglru: count PUD subtrees skipped by the PUD-level filter
Baoquan He <[email protected]>
| Newsgroups | org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
Add MM_PUD_EMPTY_SKIPPED, incremented in walk_pud_range() whenever a PUD subtree is skipped by the filter. Like other counters accumulated per walk, shown in debugfs lru_gen output (the "S" column of TYFALWEES) and via the mm_vmscan_lru_gen_walk tracepoint, so the avoided cost by the filter can be measured directly. Signed-off-by: Baoquan He <[email protected]> --- include/linux/mmzone.h | 1 + include/trace/events/vmscan.h | 10 ++++++---- mm/vmscan.c | 13 ++++++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 64eb010624b2..a039df84f907 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -599,6 +599,7 @@ enum { MM_WALK_TOTAL, /* page-table walks completed */ MM_WALK_EMPTY, /* walks that found no eligible folio */ MM_LEAF_TOTAL_EMPTY, /* leaf entries scanned by empty walks */ + MM_PUD_EMPTY_SKIPPED, /* PUD subtrees skipped by the PUD-level filter */ NR_MM_STATS }; diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h index c7c2034715b6..923fbdb20de6 100644 --- a/include/trace/events/vmscan.h +++ b/include/trace/events/vmscan.h @@ -662,9 +662,9 @@ TRACE_EVENT(mm_vmscan_kswapd_clear_hopeless, TRACE_EVENT(mm_vmscan_lru_gen_walk, TP_PROTO(int nid, unsigned long seq, int leaf_total, - int leaf_eligible, bool empty), + int leaf_eligible, bool empty, int pud_skipped), - TP_ARGS(nid, seq, leaf_total, leaf_eligible, empty), + TP_ARGS(nid, seq, leaf_total, leaf_eligible, empty, pud_skipped), TP_STRUCT__entry( __field(int, nid) @@ -672,6 +672,7 @@ TRACE_EVENT(mm_vmscan_lru_gen_walk, __field(int, leaf_total) __field(int, leaf_eligible) __field(bool, empty) + __field(int, pud_skipped) ), TP_fast_assign( @@ -680,11 +681,12 @@ TRACE_EVENT(mm_vmscan_lru_gen_walk, __entry->leaf_total = leaf_total; __entry->leaf_eligible = leaf_eligible; __entry->empty = empty; + __entry->pud_skipped = pud_skipped; ), - TP_printk("nid=%d seq=%lu leaf_total=%d leaf_eligible=%d empty=%d", + TP_printk("nid=%d seq=%lu leaf_total=%d leaf_eligible=%d empty=%d pud_skipped=%d", __entry->nid, __entry->seq, __entry->leaf_total, - __entry->leaf_eligible, __entry->empty) + __entry->leaf_eligible, __entry->empty, __entry->pud_skipped) ); #endif /* _TRACE_VMSCAN_H */ diff --git a/mm/vmscan.c b/mm/vmscan.c index cc41d3692bd5..fa437b187a05 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3868,8 +3868,10 @@ static int walk_pud_range(p4d_t *p4d, unsigned long start, unsigned long end, continue; /* Skip a subtree whose 512 PMDs all failed the PMD-level filter last gen */ - if (!walk->force_scan && !test_pud_bloom_filter(mm_state, walk->seq, pud + i)) + if (!walk->force_scan && !test_pud_bloom_filter(mm_state, walk->seq, pud + i)) { + walk->mm_stats[MM_PUD_EMPTY_SKIPPED]++; continue; + } if (walk_pmd_range(&val, addr, next, args)) update_pud_bloom_filter(mm_state, walk->seq + 1, pud + i); @@ -4213,7 +4215,8 @@ static bool try_to_inc_max_seq(struct lruvec *lruvec, unsigned long seq, trace_mm_vmscan_lru_gen_walk( lruvec_pgdat(lruvec)->node_id, walk->seq, walk->mm_stats[MM_LEAF_TOTAL], - walk->mm_stats[MM_LEAF_ELIGIBLE], empty); + walk->mm_stats[MM_LEAF_ELIGIBLE], empty, + walk->mm_stats[MM_PUD_EMPTY_SKIPPED]); } } while (mm); done: @@ -5698,14 +5701,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 = "xxxxxxxx"; + const char *s = "xxxxxxxxx"; unsigned long n = 0; if (seq == max_seq && NR_HIST_GENS == 1) { - s = "TYFALWEE"; + s = "TYFALWEES"; n = READ_ONCE(mm_state->stats[hist][i]); } else if (seq != max_seq && NR_HIST_GENS > 1) { - s = "tyfalwee"; + s = "tyfalwees"; n = READ_ONCE(mm_state->stats[hist][i]); } -- 2.54.0