xref: /linux/tools/testing/selftests/damon/damos_tried_regions.py (revision 42d37fc0c819b81f6f6afd108b55d04ba9d32d0f)
1#!/usr/bin/env python3
2# SPDX-License-Identifier: GPL-2.0
3
4import subprocess
5import time
6
7import _damon_sysfs
8
9def main():
10    # repeatedly access even-numbered ones in 14 regions of 10 MiB size
11    sz_region = 10 * 1024 * 1024
12    proc = subprocess.Popen(['./access_memory_even', '14', '%d' % sz_region])
13
14    # stat every monitored regions
15    kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond(
16            contexts=[_damon_sysfs.DamonCtx(
17                ops='vaddr',
18                targets=[_damon_sysfs.DamonTarget(pid=proc.pid)],
19                schemes=[_damon_sysfs.Damos(action='stat',
20                    )] # schemes
21                )] # contexts
22            )]) # kdamonds
23
24    err = kdamonds.start()
25    if err is not None:
26        proc.terminate()
27        print('kdamond start failed: %s' % err)
28        exit(1)
29
30    collected_nr_regions = []
31    while proc.poll() is None:
32        time.sleep(0.1)
33        err = kdamonds.kdamonds[0].update_schemes_tried_regions()
34        if err is not None:
35            proc.terminate()
36            print('tried regions update failed: %s' % err)
37            exit(1)
38
39        scheme = kdamonds.kdamonds[0].contexts[0].schemes[0]
40        if scheme.tried_regions is None:
41            proc.terminate()
42            print('tried regions is not collected')
43            exit(1)
44
45        nr_tried_regions = len(scheme.tried_regions)
46        if nr_tried_regions <= 0:
47            proc.terminate()
48            print('tried regions is not created')
49            exit(1)
50        collected_nr_regions.append(nr_tried_regions)
51        if len(collected_nr_regions) > 10:
52            break
53    proc.terminate()
54
55    collected_nr_regions.sort()
56    sample = collected_nr_regions[4]
57    print('50-th percentile nr_regions: %d' % sample)
58    print('expectation (>= 14) is %s' % 'met' if sample >= 14 else 'not met')
59    if collected_nr_regions[4] < 14:
60        print('full nr_regions:')
61        print('\n'.join(collected_nr_regions))
62        exit(1)
63
64if __name__ == '__main__':
65    main()
66