Skip to content

Commit e452872

Browse files
Hao Jiaakpm00
authored andcommitted
mm: vmscan: split proactive reclaim statistics from direct reclaim statistics
Patch series "Adding Proactive Memory Reclaim Statistics". These two patches are related to proactive memory reclaim. Patch 1 Split proactive reclaim statistics from direct reclaim counters and introduces new counters: pgsteal_proactive, pgdemote_proactive, and pgscan_proactive. Patch 2 Adds pswpin and pswpout items to the cgroup-v2 documentation. This patch (of 2): In proactive memory reclaim scenarios, it is necessary to accurately track proactive reclaim statistics to dynamically adjust the frequency and amount of memory being reclaimed proactively. Currently, proactive reclaim is included in direct reclaim statistics, which can make these direct reclaim statistics misleading. Therefore, separate proactive reclaim memory from the direct reclaim counters by introducing new counters: pgsteal_proactive, pgdemote_proactive, and pgscan_proactive, to avoid confusion with direct reclaim. Link: https://lkml.kernel.org/r/20250318075833.90615-1-jiahao.kernel@gmail.com Link: https://lkml.kernel.org/r/20250318075833.90615-2-jiahao.kernel@gmail.com Signed-off-by: Hao Jia <jiahao1@lixiang.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Michal Hocko <mhocko@kernel.org> Cc: Michal Koutný <mkoutny@suse.com> Cc: Muchun Song <muchun.song@linux.dev> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Shakeel Butt <shakeel.butt@linux.dev> Cc: Tejun Heo <tj@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent a2c6f9c commit e452872

File tree

6 files changed

+42
-15
lines changed

6 files changed

+42
-15
lines changed

Documentation/admin-guide/cgroup-v2.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,6 +1576,9 @@ The following nested keys are defined.
15761576
pgscan_khugepaged (npn)
15771577
Amount of scanned pages by khugepaged (in an inactive LRU list)
15781578

1579+
pgscan_proactive (npn)
1580+
Amount of scanned pages proactively (in an inactive LRU list)
1581+
15791582
pgsteal_kswapd (npn)
15801583
Amount of reclaimed pages by kswapd
15811584

@@ -1585,6 +1588,9 @@ The following nested keys are defined.
15851588
pgsteal_khugepaged (npn)
15861589
Amount of reclaimed pages by khugepaged
15871590

1591+
pgsteal_proactive (npn)
1592+
Amount of reclaimed pages proactively
1593+
15881594
pgfault (npn)
15891595
Total number of page faults incurred
15901596

@@ -1662,6 +1668,9 @@ The following nested keys are defined.
16621668
pgdemote_khugepaged
16631669
Number of pages demoted by khugepaged.
16641670

1671+
pgdemote_proactive
1672+
Number of pages demoted by proactively.
1673+
16651674
hugetlb
16661675
Amount of memory used by hugetlb pages. This metric only shows
16671676
up if hugetlb usage is accounted for in memory.current (i.e.

include/linux/mmzone.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ enum node_stat_item {
221221
PGDEMOTE_KSWAPD,
222222
PGDEMOTE_DIRECT,
223223
PGDEMOTE_KHUGEPAGED,
224+
PGDEMOTE_PROACTIVE,
224225
#ifdef CONFIG_HUGETLB_PAGE
225226
NR_HUGETLB,
226227
#endif

include/linux/vm_event_item.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
4141
PGSTEAL_KSWAPD,
4242
PGSTEAL_DIRECT,
4343
PGSTEAL_KHUGEPAGED,
44+
PGSTEAL_PROACTIVE,
4445
PGSCAN_KSWAPD,
4546
PGSCAN_DIRECT,
4647
PGSCAN_KHUGEPAGED,
48+
PGSCAN_PROACTIVE,
4749
PGSCAN_DIRECT_THROTTLE,
4850
PGSCAN_ANON,
4951
PGSCAN_FILE,

mm/memcontrol.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ static const unsigned int memcg_node_stat_items[] = {
315315
PGDEMOTE_KSWAPD,
316316
PGDEMOTE_DIRECT,
317317
PGDEMOTE_KHUGEPAGED,
318+
PGDEMOTE_PROACTIVE,
318319
#ifdef CONFIG_HUGETLB_PAGE
319320
NR_HUGETLB,
320321
#endif
@@ -431,9 +432,11 @@ static const unsigned int memcg_vm_event_stat[] = {
431432
PGSCAN_KSWAPD,
432433
PGSCAN_DIRECT,
433434
PGSCAN_KHUGEPAGED,
435+
PGSCAN_PROACTIVE,
434436
PGSTEAL_KSWAPD,
435437
PGSTEAL_DIRECT,
436438
PGSTEAL_KHUGEPAGED,
439+
PGSTEAL_PROACTIVE,
437440
PGFAULT,
438441
PGMAJFAULT,
439442
PGREFILL,
@@ -1394,6 +1397,7 @@ static const struct memory_stat memory_stats[] = {
13941397
{ "pgdemote_kswapd", PGDEMOTE_KSWAPD },
13951398
{ "pgdemote_direct", PGDEMOTE_DIRECT },
13961399
{ "pgdemote_khugepaged", PGDEMOTE_KHUGEPAGED },
1400+
{ "pgdemote_proactive", PGDEMOTE_PROACTIVE },
13971401
#ifdef CONFIG_NUMA_BALANCING
13981402
{ "pgpromote_success", PGPROMOTE_SUCCESS },
13991403
#endif
@@ -1436,6 +1440,7 @@ static int memcg_page_state_output_unit(int item)
14361440
case PGDEMOTE_KSWAPD:
14371441
case PGDEMOTE_DIRECT:
14381442
case PGDEMOTE_KHUGEPAGED:
1443+
case PGDEMOTE_PROACTIVE:
14391444
#ifdef CONFIG_NUMA_BALANCING
14401445
case PGPROMOTE_SUCCESS:
14411446
#endif
@@ -1509,10 +1514,12 @@ static void memcg_stat_format(struct mem_cgroup *memcg, struct seq_buf *s)
15091514
seq_buf_printf(s, "pgscan %lu\n",
15101515
memcg_events(memcg, PGSCAN_KSWAPD) +
15111516
memcg_events(memcg, PGSCAN_DIRECT) +
1517+
memcg_events(memcg, PGSCAN_PROACTIVE) +
15121518
memcg_events(memcg, PGSCAN_KHUGEPAGED));
15131519
seq_buf_printf(s, "pgsteal %lu\n",
15141520
memcg_events(memcg, PGSTEAL_KSWAPD) +
15151521
memcg_events(memcg, PGSTEAL_DIRECT) +
1522+
memcg_events(memcg, PGSTEAL_PROACTIVE) +
15161523
memcg_events(memcg, PGSTEAL_KHUGEPAGED));
15171524

15181525
for (i = 0; i < ARRAY_SIZE(memcg_vm_event_stat); i++) {

mm/vmscan.c

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -456,21 +456,26 @@ void drop_slab(void)
456456
} while ((freed >> shift++) > 1);
457457
}
458458

459-
static int reclaimer_offset(void)
459+
#define CHECK_RECLAIMER_OFFSET(type) \
460+
do { \
461+
BUILD_BUG_ON(PGSTEAL_##type - PGSTEAL_KSWAPD != \
462+
PGDEMOTE_##type - PGDEMOTE_KSWAPD); \
463+
BUILD_BUG_ON(PGSTEAL_##type - PGSTEAL_KSWAPD != \
464+
PGSCAN_##type - PGSCAN_KSWAPD); \
465+
} while (0)
466+
467+
static int reclaimer_offset(struct scan_control *sc)
460468
{
461-
BUILD_BUG_ON(PGSTEAL_DIRECT - PGSTEAL_KSWAPD !=
462-
PGDEMOTE_DIRECT - PGDEMOTE_KSWAPD);
463-
BUILD_BUG_ON(PGSTEAL_KHUGEPAGED - PGSTEAL_KSWAPD !=
464-
PGDEMOTE_KHUGEPAGED - PGDEMOTE_KSWAPD);
465-
BUILD_BUG_ON(PGSTEAL_DIRECT - PGSTEAL_KSWAPD !=
466-
PGSCAN_DIRECT - PGSCAN_KSWAPD);
467-
BUILD_BUG_ON(PGSTEAL_KHUGEPAGED - PGSTEAL_KSWAPD !=
468-
PGSCAN_KHUGEPAGED - PGSCAN_KSWAPD);
469+
CHECK_RECLAIMER_OFFSET(DIRECT);
470+
CHECK_RECLAIMER_OFFSET(KHUGEPAGED);
471+
CHECK_RECLAIMER_OFFSET(PROACTIVE);
469472

470473
if (current_is_kswapd())
471474
return 0;
472475
if (current_is_khugepaged())
473476
return PGSTEAL_KHUGEPAGED - PGSTEAL_KSWAPD;
477+
if (sc->proactive)
478+
return PGSTEAL_PROACTIVE - PGSTEAL_KSWAPD;
474479
return PGSTEAL_DIRECT - PGSTEAL_KSWAPD;
475480
}
476481

@@ -2008,7 +2013,7 @@ static unsigned long shrink_inactive_list(unsigned long nr_to_scan,
20082013
&nr_scanned, sc, lru);
20092014

20102015
__mod_node_page_state(pgdat, NR_ISOLATED_ANON + file, nr_taken);
2011-
item = PGSCAN_KSWAPD + reclaimer_offset();
2016+
item = PGSCAN_KSWAPD + reclaimer_offset(sc);
20122017
if (!cgroup_reclaim(sc))
20132018
__count_vm_events(item, nr_scanned);
20142019
__count_memcg_events(lruvec_memcg(lruvec), item, nr_scanned);
@@ -2024,10 +2029,10 @@ static unsigned long shrink_inactive_list(unsigned long nr_to_scan,
20242029
spin_lock_irq(&lruvec->lru_lock);
20252030
move_folios_to_lru(lruvec, &folio_list);
20262031

2027-
__mod_lruvec_state(lruvec, PGDEMOTE_KSWAPD + reclaimer_offset(),
2032+
__mod_lruvec_state(lruvec, PGDEMOTE_KSWAPD + reclaimer_offset(sc),
20282033
stat.nr_demoted);
20292034
__mod_node_page_state(pgdat, NR_ISOLATED_ANON + file, -nr_taken);
2030-
item = PGSTEAL_KSWAPD + reclaimer_offset();
2035+
item = PGSTEAL_KSWAPD + reclaimer_offset(sc);
20312036
if (!cgroup_reclaim(sc))
20322037
__count_vm_events(item, nr_reclaimed);
20332038
__count_memcg_events(lruvec_memcg(lruvec), item, nr_reclaimed);
@@ -4571,7 +4576,7 @@ static int scan_folios(struct lruvec *lruvec, struct scan_control *sc,
45714576
break;
45724577
}
45734578

4574-
item = PGSCAN_KSWAPD + reclaimer_offset();
4579+
item = PGSCAN_KSWAPD + reclaimer_offset(sc);
45754580
if (!cgroup_reclaim(sc)) {
45764581
__count_vm_events(item, isolated);
45774582
__count_vm_events(PGREFILL, sorted);
@@ -4721,10 +4726,10 @@ static int evict_folios(struct lruvec *lruvec, struct scan_control *sc, int swap
47214726
reset_batch_size(walk);
47224727
}
47234728

4724-
__mod_lruvec_state(lruvec, PGDEMOTE_KSWAPD + reclaimer_offset(),
4729+
__mod_lruvec_state(lruvec, PGDEMOTE_KSWAPD + reclaimer_offset(sc),
47254730
stat.nr_demoted);
47264731

4727-
item = PGSTEAL_KSWAPD + reclaimer_offset();
4732+
item = PGSTEAL_KSWAPD + reclaimer_offset(sc);
47284733
if (!cgroup_reclaim(sc))
47294734
__count_vm_events(item, reclaimed);
47304735
__count_memcg_events(memcg, item, reclaimed);

mm/vmstat.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,7 @@ const char * const vmstat_text[] = {
12741274
"pgdemote_kswapd",
12751275
"pgdemote_direct",
12761276
"pgdemote_khugepaged",
1277+
"pgdemote_proactive",
12771278
#ifdef CONFIG_HUGETLB_PAGE
12781279
"nr_hugetlb",
12791280
#endif
@@ -1309,9 +1310,11 @@ const char * const vmstat_text[] = {
13091310
"pgsteal_kswapd",
13101311
"pgsteal_direct",
13111312
"pgsteal_khugepaged",
1313+
"pgsteal_proactive",
13121314
"pgscan_kswapd",
13131315
"pgscan_direct",
13141316
"pgscan_khugepaged",
1317+
"pgscan_proactive",
13151318
"pgscan_direct_throttle",
13161319
"pgscan_anon",
13171320
"pgscan_file",

0 commit comments

Comments
 (0)