xref: /linux/tools/testing/selftests/damon/sysfs.py (revision cf20cb9ad1eb3bf59ede1f93a0640f06e6b9d028)
14ece0189SSeongJae Park#!/usr/bin/env python3
24ece0189SSeongJae Park# SPDX-License-Identifier: GPL-2.0
34ece0189SSeongJae Park
44ece0189SSeongJae Parkimport json
54ece0189SSeongJae Parkimport os
64ece0189SSeongJae Parkimport subprocess
74ece0189SSeongJae Park
84ece0189SSeongJae Parkimport _damon_sysfs
94ece0189SSeongJae Park
104ece0189SSeongJae Parkdef dump_damon_status_dict(pid):
11*cf20cb9aSSeongJae Park    try:
12*cf20cb9aSSeongJae Park        subprocess.check_output(['which', 'drgn'], stderr=subprocess.DEVNULL)
13*cf20cb9aSSeongJae Park    except:
14*cf20cb9aSSeongJae Park        return None, 'drgn not found'
154ece0189SSeongJae Park    file_dir = os.path.dirname(os.path.abspath(__file__))
164ece0189SSeongJae Park    dump_script = os.path.join(file_dir, 'drgn_dump_damon_status.py')
174ece0189SSeongJae Park    rc = subprocess.call(['drgn', dump_script, pid, 'damon_dump_output'],
184ece0189SSeongJae Park                         stderr=subprocess.DEVNULL)
194ece0189SSeongJae Park    if rc != 0:
204ece0189SSeongJae Park        return None, 'drgn fail'
214ece0189SSeongJae Park    try:
224ece0189SSeongJae Park        with open('damon_dump_output', 'r') as f:
234ece0189SSeongJae Park            return json.load(f), None
244ece0189SSeongJae Park    except Exception as e:
254ece0189SSeongJae Park        return None, 'json.load fail (%s)' % e
264ece0189SSeongJae Park
27ae3ab07eSSeongJae Parkdef fail(expectation, status):
28ae3ab07eSSeongJae Park    print('unexpected %s' % expectation)
29ae3ab07eSSeongJae Park    print(json.dumps(status, indent=4))
30ae3ab07eSSeongJae Park    exit(1)
31ae3ab07eSSeongJae Park
324ece0189SSeongJae Parkdef main():
334ece0189SSeongJae Park    kdamonds = _damon_sysfs.Kdamonds(
347e6bcf35SSeongJae Park            [_damon_sysfs.Kdamond(
357e6bcf35SSeongJae Park                contexts=[_damon_sysfs.DamonCtx(
36603cb4aaSSeongJae Park                    targets=[_damon_sysfs.DamonTarget(pid=-1)],
37603cb4aaSSeongJae Park                    schemes=[_damon_sysfs.Damos()],
38603cb4aaSSeongJae Park                    )])])
394ece0189SSeongJae Park    err = kdamonds.start()
404ece0189SSeongJae Park    if err is not None:
414ece0189SSeongJae Park        print('kdamond start failed: %s' % err)
424ece0189SSeongJae Park        exit(1)
434ece0189SSeongJae Park
444ece0189SSeongJae Park    status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
454ece0189SSeongJae Park    if err is not None:
464ece0189SSeongJae Park        print(err)
47*cf20cb9aSSeongJae Park        kdamonds.stop()
484ece0189SSeongJae Park        exit(1)
494ece0189SSeongJae Park
504ece0189SSeongJae Park    if len(status['contexts']) != 1:
51ae3ab07eSSeongJae Park        fail('number of contexts', status)
52ae3ab07eSSeongJae Park
53ae3ab07eSSeongJae Park    ctx = status['contexts'][0]
54ae3ab07eSSeongJae Park    attrs = ctx['attrs']
55ae3ab07eSSeongJae Park    if attrs['sample_interval'] != 5000:
56ae3ab07eSSeongJae Park        fail('sample interval', status)
57ae3ab07eSSeongJae Park    if attrs['aggr_interval'] != 100000:
58ae3ab07eSSeongJae Park        fail('aggr interval', status)
59ae3ab07eSSeongJae Park    if attrs['ops_update_interval'] != 1000000:
60ae3ab07eSSeongJae Park        fail('ops updte interval', status)
61ae3ab07eSSeongJae Park
62ae3ab07eSSeongJae Park    if attrs['intervals_goal'] != {
63ae3ab07eSSeongJae Park            'access_bp': 0, 'aggrs': 0,
64ae3ab07eSSeongJae Park            'min_sample_us': 0, 'max_sample_us': 0}:
65ae3ab07eSSeongJae Park        fail('intervals goal')
66ae3ab07eSSeongJae Park
67ae3ab07eSSeongJae Park    if attrs['min_nr_regions'] != 10:
68ae3ab07eSSeongJae Park        fail('min_nr_regions')
69ae3ab07eSSeongJae Park    if attrs['max_nr_regions'] != 1000:
70ae3ab07eSSeongJae Park        fail('max_nr_regions')
71ae3ab07eSSeongJae Park
727e6bcf35SSeongJae Park    if ctx['adaptive_targets'] != [
737e6bcf35SSeongJae Park            { 'pid': 0, 'nr_regions': 0, 'regions_list': []}]:
747e6bcf35SSeongJae Park        fail('adaptive targets', status)
75ae3ab07eSSeongJae Park
76603cb4aaSSeongJae Park    if len(ctx['schemes']) != 1:
77603cb4aaSSeongJae Park        fail('number of schemes', status)
78603cb4aaSSeongJae Park
79603cb4aaSSeongJae Park    scheme = ctx['schemes'][0]
80603cb4aaSSeongJae Park    if scheme['pattern'] != {
81603cb4aaSSeongJae Park            'min_sz_region': 0,
82603cb4aaSSeongJae Park            'max_sz_region': 2**64 - 1,
83603cb4aaSSeongJae Park            'min_nr_accesses': 0,
84603cb4aaSSeongJae Park            'max_nr_accesses': 2**32 - 1,
85603cb4aaSSeongJae Park            'min_age_region': 0,
86603cb4aaSSeongJae Park            'max_age_region': 2**32 - 1,
87603cb4aaSSeongJae Park            }:
88603cb4aaSSeongJae Park        fail('damos pattern', status)
89603cb4aaSSeongJae Park    if scheme['action'] != 9:   # stat
90603cb4aaSSeongJae Park        fail('damos action', status)
91603cb4aaSSeongJae Park    if scheme['apply_interval_us'] != 0:
92603cb4aaSSeongJae Park        fail('damos apply interval', status)
93603cb4aaSSeongJae Park    if scheme['target_nid'] != -1:
94603cb4aaSSeongJae Park        fail('damos target nid', status)
95603cb4aaSSeongJae Park
96603cb4aaSSeongJae Park    if scheme['quota'] != {
97603cb4aaSSeongJae Park            'reset_interval': 0,
98603cb4aaSSeongJae Park            'ms': 0,
99603cb4aaSSeongJae Park            'sz': 0,
100603cb4aaSSeongJae Park            'goals': [],
101603cb4aaSSeongJae Park            'esz': 0,
102603cb4aaSSeongJae Park            'weight_sz': 0,
103603cb4aaSSeongJae Park            'weight_nr_accesses': 0,
104603cb4aaSSeongJae Park            'weight_age': 0,
105603cb4aaSSeongJae Park            }:
106603cb4aaSSeongJae Park        fail('damos quota', status)
107603cb4aaSSeongJae Park
108603cb4aaSSeongJae Park    if scheme['wmarks'] != {
109603cb4aaSSeongJae Park            'metric': 0,
110603cb4aaSSeongJae Park            'interval': 0,
111603cb4aaSSeongJae Park            'high': 0,
112603cb4aaSSeongJae Park            'mid': 0,
113603cb4aaSSeongJae Park            'low': 0,
114603cb4aaSSeongJae Park            }:
115603cb4aaSSeongJae Park        fail('damos wmarks', status)
116ae3ab07eSSeongJae Park
1174ece0189SSeongJae Park    kdamonds.stop()
1184ece0189SSeongJae Park
1194ece0189SSeongJae Parkif __name__ == '__main__':
1204ece0189SSeongJae Park    main()
121