xref: /linux/tools/testing/selftests/damon/sysfs.py (revision 603cb4aa09a14157ba412ba4db9dffebb79eb598)
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):
114ece0189SSeongJae Park    file_dir = os.path.dirname(os.path.abspath(__file__))
124ece0189SSeongJae Park    dump_script = os.path.join(file_dir, 'drgn_dump_damon_status.py')
134ece0189SSeongJae Park    rc = subprocess.call(['drgn', dump_script, pid, 'damon_dump_output'],
144ece0189SSeongJae Park                         stderr=subprocess.DEVNULL)
154ece0189SSeongJae Park    if rc != 0:
164ece0189SSeongJae Park        return None, 'drgn fail'
174ece0189SSeongJae Park    try:
184ece0189SSeongJae Park        with open('damon_dump_output', 'r') as f:
194ece0189SSeongJae Park            return json.load(f), None
204ece0189SSeongJae Park    except Exception as e:
214ece0189SSeongJae Park        return None, 'json.load fail (%s)' % e
224ece0189SSeongJae Park
23ae3ab07eSSeongJae Parkdef fail(expectation, status):
24ae3ab07eSSeongJae Park    print('unexpected %s' % expectation)
25ae3ab07eSSeongJae Park    print(json.dumps(status, indent=4))
26ae3ab07eSSeongJae Park    exit(1)
27ae3ab07eSSeongJae Park
284ece0189SSeongJae Parkdef main():
294ece0189SSeongJae Park    kdamonds = _damon_sysfs.Kdamonds(
307e6bcf35SSeongJae Park            [_damon_sysfs.Kdamond(
317e6bcf35SSeongJae Park                contexts=[_damon_sysfs.DamonCtx(
32*603cb4aaSSeongJae Park                    targets=[_damon_sysfs.DamonTarget(pid=-1)],
33*603cb4aaSSeongJae Park                    schemes=[_damon_sysfs.Damos()],
34*603cb4aaSSeongJae Park                    )])])
354ece0189SSeongJae Park    err = kdamonds.start()
364ece0189SSeongJae Park    if err is not None:
374ece0189SSeongJae Park        print('kdamond start failed: %s' % err)
384ece0189SSeongJae Park        exit(1)
394ece0189SSeongJae Park
404ece0189SSeongJae Park    status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
414ece0189SSeongJae Park    if err is not None:
424ece0189SSeongJae Park        print(err)
434ece0189SSeongJae Park        exit(1)
444ece0189SSeongJae Park
454ece0189SSeongJae Park    if len(status['contexts']) != 1:
46ae3ab07eSSeongJae Park        fail('number of contexts', status)
47ae3ab07eSSeongJae Park
48ae3ab07eSSeongJae Park    ctx = status['contexts'][0]
49ae3ab07eSSeongJae Park    attrs = ctx['attrs']
50ae3ab07eSSeongJae Park    if attrs['sample_interval'] != 5000:
51ae3ab07eSSeongJae Park        fail('sample interval', status)
52ae3ab07eSSeongJae Park    if attrs['aggr_interval'] != 100000:
53ae3ab07eSSeongJae Park        fail('aggr interval', status)
54ae3ab07eSSeongJae Park    if attrs['ops_update_interval'] != 1000000:
55ae3ab07eSSeongJae Park        fail('ops updte interval', status)
56ae3ab07eSSeongJae Park
57ae3ab07eSSeongJae Park    if attrs['intervals_goal'] != {
58ae3ab07eSSeongJae Park            'access_bp': 0, 'aggrs': 0,
59ae3ab07eSSeongJae Park            'min_sample_us': 0, 'max_sample_us': 0}:
60ae3ab07eSSeongJae Park        fail('intervals goal')
61ae3ab07eSSeongJae Park
62ae3ab07eSSeongJae Park    if attrs['min_nr_regions'] != 10:
63ae3ab07eSSeongJae Park        fail('min_nr_regions')
64ae3ab07eSSeongJae Park    if attrs['max_nr_regions'] != 1000:
65ae3ab07eSSeongJae Park        fail('max_nr_regions')
66ae3ab07eSSeongJae Park
677e6bcf35SSeongJae Park    if ctx['adaptive_targets'] != [
687e6bcf35SSeongJae Park            { 'pid': 0, 'nr_regions': 0, 'regions_list': []}]:
697e6bcf35SSeongJae Park        fail('adaptive targets', status)
70ae3ab07eSSeongJae Park
71*603cb4aaSSeongJae Park    if len(ctx['schemes']) != 1:
72*603cb4aaSSeongJae Park        fail('number of schemes', status)
73*603cb4aaSSeongJae Park
74*603cb4aaSSeongJae Park    scheme = ctx['schemes'][0]
75*603cb4aaSSeongJae Park    if scheme['pattern'] != {
76*603cb4aaSSeongJae Park            'min_sz_region': 0,
77*603cb4aaSSeongJae Park            'max_sz_region': 2**64 - 1,
78*603cb4aaSSeongJae Park            'min_nr_accesses': 0,
79*603cb4aaSSeongJae Park            'max_nr_accesses': 2**32 - 1,
80*603cb4aaSSeongJae Park            'min_age_region': 0,
81*603cb4aaSSeongJae Park            'max_age_region': 2**32 - 1,
82*603cb4aaSSeongJae Park            }:
83*603cb4aaSSeongJae Park        fail('damos pattern', status)
84*603cb4aaSSeongJae Park    if scheme['action'] != 9:   # stat
85*603cb4aaSSeongJae Park        fail('damos action', status)
86*603cb4aaSSeongJae Park    if scheme['apply_interval_us'] != 0:
87*603cb4aaSSeongJae Park        fail('damos apply interval', status)
88*603cb4aaSSeongJae Park    if scheme['target_nid'] != -1:
89*603cb4aaSSeongJae Park        fail('damos target nid', status)
90*603cb4aaSSeongJae Park
91*603cb4aaSSeongJae Park    if scheme['quota'] != {
92*603cb4aaSSeongJae Park            'reset_interval': 0,
93*603cb4aaSSeongJae Park            'ms': 0,
94*603cb4aaSSeongJae Park            'sz': 0,
95*603cb4aaSSeongJae Park            'goals': [],
96*603cb4aaSSeongJae Park            'esz': 0,
97*603cb4aaSSeongJae Park            'weight_sz': 0,
98*603cb4aaSSeongJae Park            'weight_nr_accesses': 0,
99*603cb4aaSSeongJae Park            'weight_age': 0,
100*603cb4aaSSeongJae Park            }:
101*603cb4aaSSeongJae Park        fail('damos quota', status)
102*603cb4aaSSeongJae Park
103*603cb4aaSSeongJae Park    if scheme['wmarks'] != {
104*603cb4aaSSeongJae Park            'metric': 0,
105*603cb4aaSSeongJae Park            'interval': 0,
106*603cb4aaSSeongJae Park            'high': 0,
107*603cb4aaSSeongJae Park            'mid': 0,
108*603cb4aaSSeongJae Park            'low': 0,
109*603cb4aaSSeongJae Park            }:
110*603cb4aaSSeongJae Park        fail('damos wmarks', status)
111ae3ab07eSSeongJae Park
1124ece0189SSeongJae Park    kdamonds.stop()
1134ece0189SSeongJae Park
1144ece0189SSeongJae Parkif __name__ == '__main__':
1154ece0189SSeongJae Park    main()
116