mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
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>
This commit is contained in:
parent
5b3d04dece
commit
df8060e665
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user