xref: /linux/tools/testing/selftests/damon/sysfs.py (revision ae3ab07e0d0488925008c19f03ba02d7818c85af)
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
23*ae3ab07eSSeongJae Parkdef fail(expectation, status):
24*ae3ab07eSSeongJae Park    print('unexpected %s' % expectation)
25*ae3ab07eSSeongJae Park    print(json.dumps(status, indent=4))
26*ae3ab07eSSeongJae Park    exit(1)
27*ae3ab07eSSeongJae Park
284ece0189SSeongJae Parkdef main():
294ece0189SSeongJae Park    kdamonds = _damon_sysfs.Kdamonds(
304ece0189SSeongJae Park            [_damon_sysfs.Kdamond(contexts=[_damon_sysfs.DamonCtx()])])
314ece0189SSeongJae Park    err = kdamonds.start()
324ece0189SSeongJae Park    if err is not None:
334ece0189SSeongJae Park        print('kdamond start failed: %s' % err)
344ece0189SSeongJae Park        exit(1)
354ece0189SSeongJae Park
364ece0189SSeongJae Park    status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
374ece0189SSeongJae Park    if err is not None:
384ece0189SSeongJae Park        print(err)
394ece0189SSeongJae Park        exit(1)
404ece0189SSeongJae Park
414ece0189SSeongJae Park    if len(status['contexts']) != 1:
42*ae3ab07eSSeongJae Park        fail('number of contexts', status)
43*ae3ab07eSSeongJae Park
44*ae3ab07eSSeongJae Park    ctx = status['contexts'][0]
45*ae3ab07eSSeongJae Park    attrs = ctx['attrs']
46*ae3ab07eSSeongJae Park    if attrs['sample_interval'] != 5000:
47*ae3ab07eSSeongJae Park        fail('sample interval', status)
48*ae3ab07eSSeongJae Park    if attrs['aggr_interval'] != 100000:
49*ae3ab07eSSeongJae Park        fail('aggr interval', status)
50*ae3ab07eSSeongJae Park    if attrs['ops_update_interval'] != 1000000:
51*ae3ab07eSSeongJae Park        fail('ops updte interval', status)
52*ae3ab07eSSeongJae Park
53*ae3ab07eSSeongJae Park    if attrs['intervals_goal'] != {
54*ae3ab07eSSeongJae Park            'access_bp': 0, 'aggrs': 0,
55*ae3ab07eSSeongJae Park            'min_sample_us': 0, 'max_sample_us': 0}:
56*ae3ab07eSSeongJae Park        fail('intervals goal')
57*ae3ab07eSSeongJae Park
58*ae3ab07eSSeongJae Park    if attrs['min_nr_regions'] != 10:
59*ae3ab07eSSeongJae Park        fail('min_nr_regions')
60*ae3ab07eSSeongJae Park    if attrs['max_nr_regions'] != 1000:
61*ae3ab07eSSeongJae Park        fail('max_nr_regions')
62*ae3ab07eSSeongJae Park
63*ae3ab07eSSeongJae Park    if ctx['adaptive_targets'] != []:
64*ae3ab07eSSeongJae Park        fail('adaptive_targets')
65*ae3ab07eSSeongJae Park
66*ae3ab07eSSeongJae Park    if ctx['schemes'] != []:
67*ae3ab07eSSeongJae Park        fail('schemes')
68*ae3ab07eSSeongJae Park
694ece0189SSeongJae Park    kdamonds.stop()
704ece0189SSeongJae Park
714ece0189SSeongJae Parkif __name__ == '__main__':
724ece0189SSeongJae Park    main()
73