diff options
| author | SJ Park <sj@kernel.org> | 2026-09-09 07:04:03 -0700 |
|---|---|---|
| committer | Andrew Morton <akpm@linux-foundation.org> | 2026-09-13 21:32:29 -0700 |
| commit | 88ac1f509a7e6a6e5948e254c9b1c0473229becd (patch) | |
| tree | 26eeee1345aa59178b819ddc7a9ae8d769b782e5 /mm | |
| parent | d490b2288090ada5f9de1c2cb9adb5304c9de433 (diff) | |
| download | linux-next-88ac1f509a7e6a6e5948e254c9b1c0473229becd.tar.gz linux-next-88ac1f509a7e6a6e5948e254c9b1c0473229becd.zip | |
mm/damon/vaddr: support prep_probes
Patch series "mm/damon/vaddr: support {prep,apply}_probes".
DAMON supports data attributes monitoring. However, only the physical
address space operation set (paddr) is supporting it. Add the support to
the virtual address space operation set (vaddr).
Patch 1 adds prep_probes support to vaddr. Patch 2 moves probe filter
handling code in paddr.c that can be reused by vaddr to ops-common.c.
Patch 3 adds minimum apply_probes support to vaddr. Patch 4 extends the
support for hugetlb. Patch 5 extends the support for pgidle_unset
filter.
Test
====
I confirmed it can capture ~48 mb working set of masim in vaddr mode,
like below.
First, start masim [1] to access ~48 mb memory at a time, in the
background.
$ ./masim/masim.py run \
--config_file ./masim/configs/stairs-50mb.cfg \
--repeat 10 --quiet &
Note that the config says the working set is 50mb. It is 50 million
bytes, so ~48 MiB.
Start traditional access monitoring of masim's virtual address space
using damo [2].
$ sudo ./damo/damo start $(pidof masim)
Confirm it can capture the ~48 MiB working set as the 4-th region on the
snapshot.
$ sudo ./damo/damo report access
heatmap:
11111111334[...]3000000000000000000000000000000000000000489999997777777743333333555556[...]8
# min/max temperatures: -1,150,000,000, 80,009,499, column size: 6.963
MiB
intervals: sample 5 ms aggr 100 ms (max access hz 200)
0 addr 85.355 TiB size 55.703 MiB access 0 hz age 9.500 s
1 addr 85.355 TiB size 18.984 MiB access 0 hz age 6.700 s
2 addr 127.183 TiB size 278.516 MiB access 0 hz age 11.500 s
3 addr 127.183 TiB size 7.570 MiB access 0 hz age 900 ms
4 addr 127.183 TiB size 48.133 MiB access 190 hz age 800 ms
5 addr 127.183 TiB size 54.977 MiB access 0 hz age 1.700 s
6 addr 127.183 TiB size 55.113 MiB access 0 hz age 6.700 s
7 addr 127.183 TiB size 37.902 MiB access 0 hz age 3.900 s
8 addr 127.990 TiB size 120.000 KiB access 0 hz age 11.400 s
9 addr 127.990 TiB size 8.000 KiB access 70 hz age 0 ns
10 addr 127.990 TiB size 4.000 KiB access 0 hz age 11.200 s
memory bw estimate: 8.931 GiB per second
total size: 557.027 MiB
record DAMON intervals: sample 5 ms, aggr 100 ms
Stop access monitoring and start probe-only mode access monitoring.
$ sudo ./damo/damo stop
$ sudo ./damo/damo start $(pidof masim) --probe_prep set_pgidle \
--probe_filter allow pgidle_unset --probe_weight 1
Confirm it can also capture the ~48 MiB working set as the 11-th region
on the snapshot.
$ sudo ./damo/damo report attrs
heatmap:
00000000113[...]40000000000000000000000000000000000000000000000001111114999999533333336[...]6
# min/max temperatures: -840,000,000, 330,002,000, column size: 6.961
MiB
probe prep: set_pgidle, filter: allow pgidle_unset (weight: 1)
intervals: sample 5 ms aggr 100 ms (max probe hits 20)
# size address age probe_hits
0 8.000 KiB 127.990 TiB 8.700 s 0
1 120.000 KiB 127.990 TiB 8.600 s 0
2 55.543 MiB 127.183 TiB 8.400 s 0
3 110.008 MiB 127.183 TiB 8.300 s 0
4 55.352 MiB 127.183 TiB 8.100 s 0
5 55.605 MiB 127.183 TiB 8 s 0
6 55.691 MiB 85.355 TiB 7.900 s 0
7 54.430 MiB 127.183 TiB 7.900 s 0
8 50.391 MiB 127.183 TiB 6.900 s 0
9 18.879 MiB 85.355 TiB 6 s 0
10 52.844 MiB 127.183 TiB 3.500 s 0
11 48.039 MiB 127.183 TiB 3.300 s 20
12 4.000 KiB 127.990 TiB 8.500 s 20
memory bw estimate: 0 B per second
total size: 556.910 MiB
record DAMON intervals: sample 5 ms, aggr 100 ms
This patch (of 5):
DAMON virtual address space operation set (vaddr) is not supporting
prep_probes. Add the support.
Link: https://lore.kernel.org/20260909140408.104699-2-sj@kernel.org
Link: https://github.com/sjp38/masim [1]
Link: https://github.com/damonitor/damo [2]
Signed-off-by: SJ Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Gutierrez Asier <gutierrez.asier@huawei-partners.com>
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/damon/vaddr.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c index af9e1b82454c..20f4784f1781 100644 --- a/mm/damon/vaddr.c +++ b/mm/damon/vaddr.c @@ -483,6 +483,45 @@ static unsigned int damon_va_check_accesses(struct damon_ctx *ctx) return max_nr_accesses; } +static void damon_va_prep_probe_region(struct damon_ctx *ctx, + struct mm_struct *mm, struct damon_region *r, + struct damon_probe *probe) +{ + struct damon_prep *p; + + damon_for_each_prep(p, probe) { + switch (p->action) { + case DAMON_PREP_SET_PGIDLE: + damon_va_mkold(mm, r->sampling_addr); + break; + default: + break; + } + } +} + +static void damon_va_prep_probes(struct damon_ctx *ctx, bool set_samples) +{ + struct damon_target *t; + struct mm_struct *mm; + struct damon_region *r; + struct damon_probe *p; + + damon_for_each_target(t, ctx) { + mm = damon_get_mm(t); + if (!mm) + continue; + damon_for_each_region(r, t) { + if (set_samples) + r->sampling_addr = damon_rand(ctx, r->ar.start, + r->ar.end); + damon_for_each_probe(p, ctx) + damon_va_prep_probe_region(ctx, mm, r, p); + } + mmput(mm); + } +} + static bool damos_va_filter_young_match(struct damos_filter *filter, struct folio *folio, struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pmd_t *pmdp) @@ -911,6 +950,7 @@ static int __init damon_va_initcall(void) .update = damon_va_update, .prepare_access_checks = damon_va_prepare_access_checks, .check_accesses = damon_va_check_accesses, + .prep_probes = damon_va_prep_probes, .target_valid = damon_va_target_valid, .cleanup_target = damon_va_cleanup_target, .apply_scheme = damon_va_apply_scheme, |
