Skip to content

Commit f1c07c0

Browse files
sjp38akpm00
authored andcommitted
selftests/damon: add a test for DAMOS quota goal
Add a selftest for DAMOS quota goal. It tests the feature by setting a user_input metric based goal, change the current feedback, and check if the effective quota size is increased and decreased as expected. 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 d14d6b0 commit f1c07c0

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

tools/testing/selftests/damon/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ TEST_PROGS += debugfs_target_ids_pid_leak.sh
1616
TEST_PROGS += sysfs.sh sysfs_update_removed_scheme_dir.sh
1717
TEST_PROGS += sysfs_update_schemes_tried_regions_hang.py
1818
TEST_PROGS += sysfs_update_schemes_tried_regions_wss_estimation.py
19-
TEST_PROGS += damos_quota.py damos_apply_interval.py
19+
TEST_PROGS += damos_quota.py damos_quota_goal.py damos_apply_interval.py
2020
TEST_PROGS += reclaim.sh lru_sort.sh
2121

2222
include ../lib.mk
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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 main():
10+
# access two 10 MiB memory regions, 2 second per each
11+
sz_region = 10 * 1024 * 1024
12+
proc = subprocess.Popen(['./access_memory', '2', '%d' % sz_region, '2000'])
13+
14+
goal = _damon_sysfs.DamosQuotaGoal(
15+
metric=_damon_sysfs.qgoal_metric_user_input, target_value=10000)
16+
kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond(
17+
contexts=[_damon_sysfs.DamonCtx(
18+
ops='vaddr',
19+
targets=[_damon_sysfs.DamonTarget(pid=proc.pid)],
20+
schemes=[_damon_sysfs.Damos(
21+
action='stat',
22+
quota=_damon_sysfs.DamosQuota(
23+
goals=[goal], reset_interval_ms=100),
24+
)] # schemes
25+
)] # contexts
26+
)]) # kdamonds
27+
28+
err = kdamonds.start()
29+
if err != None:
30+
print('kdamond start failed: %s' % err)
31+
exit(1)
32+
33+
score_values_to_test = [0, 15000, 5000, 18000]
34+
while proc.poll() == None:
35+
if len(score_values_to_test) == 0:
36+
time.sleep(0.1)
37+
continue
38+
39+
goal.current_value = score_values_to_test.pop(0)
40+
expect_increase = goal.current_value < goal.target_value
41+
42+
err = kdamonds.kdamonds[0].commit_schemes_quota_goals()
43+
if err is not None:
44+
print('commit_schemes_quota_goals failed: %s' % err)
45+
exit(1)
46+
47+
err = kdamonds.kdamonds[0].update_schemes_effective_quotas()
48+
if err is not None:
49+
print('before-update_schemes_effective_quotas failed: %s' % err)
50+
exit(1)
51+
last_effective_bytes = goal.effective_bytes
52+
53+
time.sleep(0.5)
54+
55+
err = kdamonds.kdamonds[0].update_schemes_effective_quotas()
56+
if err is not None:
57+
print('after-update_schemes_effective_quotas failed: %s' % err)
58+
exit(1)
59+
60+
print('score: %s, effective quota: %d -> %d (%.3fx)' % (
61+
goal.current_value, last_effective_bytes, goal.effective_bytes,
62+
goal.effective_bytes / last_effective_bytes
63+
if last_effective_bytes != 0 else -1.0))
64+
65+
if last_effective_bytes == goal.effective_bytes:
66+
print('efective bytes not changed: %d' % goal.effective_bytes)
67+
exit(1)
68+
69+
increased = last_effective_bytes < goal.effective_bytes
70+
if expect_increase != increased:
71+
print('expectation of increase (%s) != increased (%s)' %
72+
(expect_increase, increased))
73+
exit(1)
74+
last_effective_bytes = goal.effective_bytes
75+
76+
if __name__ == '__main__':
77+
main()

0 commit comments

Comments
 (0)