Skip to content

Commit 7814973

Browse files
sjp38akpm00
authored andcommitted
selftests/damon: implement test for min/max_nr_regions
Implement a kselftest for DAMON's {min,max}_nr_regions' parameters. The test ensures both the minimum and the maximum number of regions limit is respected even if the workload's real number of regions is less than the minimum or larger than the maximum limits. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: SeongJae Park <[email protected]> Cc: Shuah Khan <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent f606360 commit 7814973

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

tools/testing/selftests/damon/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ TEST_PROGS = debugfs_attrs.sh debugfs_schemes.sh debugfs_target_ids.sh
1313
TEST_PROGS += sysfs.sh
1414
TEST_PROGS += sysfs_update_schemes_tried_regions_wss_estimation.py
1515
TEST_PROGS += damos_quota.py damos_quota_goal.py damos_apply_interval.py
16-
TEST_PROGS += damos_tried_regions.py
16+
TEST_PROGS += damos_tried_regions.py damon_nr_regions.py
1717
TEST_PROGS += reclaim.sh lru_sort.sh
1818

1919
# regression tests (reproducers of previously found bugs)
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#!/usr/bin/env python3
2+
# SPDX-License-Identifier: GPL-2.0
3+
4+
import subprocess
5+
import time
6+
7+
import _damon_sysfs
8+
9+
def test_nr_regions(real_nr_regions, min_nr_regions, max_nr_regions):
10+
'''
11+
Create process of the given 'real_nr_regions' regions, monitor it using
12+
DAMON with given '{min,max}_nr_regions' monitoring parameter.
13+
14+
Exit with non-zero return code if the given {min,max}_nr_regions is not
15+
kept.
16+
'''
17+
sz_region = 10 * 1024 * 1024
18+
proc = subprocess.Popen(['./access_memory_even', '%d' % real_nr_regions,
19+
'%d' % sz_region])
20+
21+
# stat every monitored regions
22+
kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond(
23+
contexts=[_damon_sysfs.DamonCtx(
24+
monitoring_attrs=_damon_sysfs.DamonAttrs(
25+
min_nr_regions=min_nr_regions,
26+
max_nr_regions=max_nr_regions),
27+
ops='vaddr',
28+
targets=[_damon_sysfs.DamonTarget(pid=proc.pid)],
29+
schemes=[_damon_sysfs.Damos(action='stat',
30+
)] # schemes
31+
)] # contexts
32+
)]) # kdamonds
33+
34+
err = kdamonds.start()
35+
if err is not None:
36+
proc.terminate()
37+
print('kdamond start failed: %s' % err)
38+
exit(1)
39+
40+
collected_nr_regions = []
41+
while proc.poll() is None:
42+
time.sleep(0.1)
43+
err = kdamonds.kdamonds[0].update_schemes_tried_regions()
44+
if err is not None:
45+
proc.terminate()
46+
print('tried regions update failed: %s' % err)
47+
exit(1)
48+
49+
scheme = kdamonds.kdamonds[0].contexts[0].schemes[0]
50+
if scheme.tried_regions is None:
51+
proc.terminate()
52+
print('tried regions is not collected')
53+
exit(1)
54+
55+
nr_tried_regions = len(scheme.tried_regions)
56+
if nr_tried_regions <= 0:
57+
proc.terminate()
58+
print('tried regions is not created')
59+
exit(1)
60+
collected_nr_regions.append(nr_tried_regions)
61+
if len(collected_nr_regions) > 10:
62+
break
63+
proc.terminate()
64+
kdamonds.stop()
65+
66+
test_name = 'nr_regions test with %d/%d/%d real/min/max nr_regions' % (
67+
real_nr_regions, min_nr_regions, max_nr_regions)
68+
if (collected_nr_regions[0] < min_nr_regions or
69+
collected_nr_regions[-1] > max_nr_regions):
70+
print('fail %s' % test_name)
71+
print('number of regions that collected are:')
72+
for nr in collected_nr_regions:
73+
print(nr)
74+
exit(1)
75+
print('pass %s ' % test_name)
76+
77+
def main():
78+
# test min_nr_regions larger than real nr regions
79+
test_nr_regions(10, 20, 100)
80+
81+
# test max_nr_regions smaller than real nr regions
82+
test_nr_regions(15, 3, 10)
83+
84+
if __name__ == '__main__':
85+
main()

0 commit comments

Comments
 (0)