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    # 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
76if __name__ == '__main__':
77    main()
78