xref: /linux/tools/testing/selftests/damon/sysfs.py (revision 7e6bcf354f3ea5cc409a7210a4b3834585e61954)
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(
30*7e6bcf35SSeongJae Park            [_damon_sysfs.Kdamond(
31*7e6bcf35SSeongJae Park                contexts=[_damon_sysfs.DamonCtx(
32*7e6bcf35SSeongJae Park                    targets=[_damon_sysfs.DamonTarget(pid=-1)])])])
334ece0189SSeongJae Park    err = kdamonds.start()
344ece0189SSeongJae Park    if err is not None:
354ece0189SSeongJae Park        print('kdamond start failed: %s' % err)
364ece0189SSeongJae Park        exit(1)
374ece0189SSeongJae Park
384ece0189SSeongJae Park    status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
394ece0189SSeongJae Park    if err is not None:
404ece0189SSeongJae Park        print(err)
414ece0189SSeongJae Park        exit(1)
424ece0189SSeongJae Park
434ece0189SSeongJae Park    if len(status['contexts']) != 1:
44ae3ab07eSSeongJae Park        fail('number of contexts', status)
45ae3ab07eSSeongJae Park
46ae3ab07eSSeongJae Park    ctx = status['contexts'][0]
47ae3ab07eSSeongJae Park    attrs = ctx['attrs']
48ae3ab07eSSeongJae Park    if attrs['sample_interval'] != 5000:
49ae3ab07eSSeongJae Park        fail('sample interval', status)
50ae3ab07eSSeongJae Park    if attrs['aggr_interval'] != 100000:
51ae3ab07eSSeongJae Park        fail('aggr interval', status)
52ae3ab07eSSeongJae Park    if attrs['ops_update_interval'] != 1000000:
53ae3ab07eSSeongJae Park        fail('ops updte interval', status)
54ae3ab07eSSeongJae Park
55ae3ab07eSSeongJae Park    if attrs['intervals_goal'] != {
56ae3ab07eSSeongJae Park            'access_bp': 0, 'aggrs': 0,
57ae3ab07eSSeongJae Park            'min_sample_us': 0, 'max_sample_us': 0}:
58ae3ab07eSSeongJae Park        fail('intervals goal')
59ae3ab07eSSeongJae Park
60ae3ab07eSSeongJae Park    if attrs['min_nr_regions'] != 10:
61ae3ab07eSSeongJae Park        fail('min_nr_regions')
62ae3ab07eSSeongJae Park    if attrs['max_nr_regions'] != 1000:
63ae3ab07eSSeongJae Park        fail('max_nr_regions')
64ae3ab07eSSeongJae Park
65*7e6bcf35SSeongJae Park    if ctx['adaptive_targets'] != [
66*7e6bcf35SSeongJae Park            { 'pid': 0, 'nr_regions': 0, 'regions_list': []}]:
67*7e6bcf35SSeongJae Park        fail('adaptive targets', status)
68ae3ab07eSSeongJae Park
69ae3ab07eSSeongJae Park    if ctx['schemes'] != []:
70ae3ab07eSSeongJae Park        fail('schemes')
71ae3ab07eSSeongJae Park
724ece0189SSeongJae Park    kdamonds.stop()
734ece0189SSeongJae Park
744ece0189SSeongJae Parkif __name__ == '__main__':
754ece0189SSeongJae Park    main()
76