| #!/usr/bin/env python3 | |
| # SPDX-License-Identifier: GPL-2.0 | |
| import json | |
| import os | |
| import subprocess | |
| import sys | |
| import _damon_sysfs | |
| def dump_damon_status_dict(pid): | |
| try: | |
| subprocess.check_output(['which', 'drgn'], stderr=subprocess.DEVNULL) | |
| except: | |
| return None, 'drgn not found' | |
| file_dir = os.path.dirname(os.path.abspath(__file__)) | |
| dump_script = os.path.join(file_dir, 'drgn_dump_damon_status.py') | |
| rc = subprocess.call(['drgn', dump_script, pid, 'damon_dump_output'], | |
| stderr=subprocess.DEVNULL) | |
| if rc != 0: | |
| return None, f'drgn fail: return code({rc})' | |
| try: | |
| with open('damon_dump_output', 'r') as f: | |
| return json.load(f), None | |
| except Exception as e: | |
| return None, 'json.load fail (%s)' % e | |
| def main(): | |
| kdamonds = _damon_sysfs.Kdamonds( | |
| [_damon_sysfs.Kdamond( | |
| contexts=[_damon_sysfs.DamonCtx( | |
| schemes=[_damon_sysfs.Damos( | |
| ops_filters=[ | |
| _damon_sysfs.DamosFilter( | |
| type_='anon', | |
| matching=True, | |
| allow=True, | |
| ) | |
| ] | |
| )], | |
| )])] | |
| ) | |
| err = kdamonds.start() | |
| if err is not None: | |
| print('kdamond start failed: %s' % err) | |
| exit(1) | |
| before_commit_status, err = \ | |
| dump_damon_status_dict(kdamonds.kdamonds[0].pid) | |
| if err is not None: | |
| print('before-commit status dump failed: %s' % err) | |
| exit(1) | |
| kdamonds.kdamonds[0].commit() | |
| after_commit_status, err = \ | |
| dump_damon_status_dict(kdamonds.kdamonds[0].pid) | |
| if err is not None: | |
| print('after-commit status dump failed: %s' % err) | |
| exit(1) | |
| if before_commit_status != after_commit_status: | |
| print(f'before: {json.dumps(before_commit_status, indent=2)}') | |
| print(f'after: {json.dumps(after_commit_status, indent=2)}') | |
| exit(1) | |
| kdamonds.stop() | |
| if __name__ == '__main__': | |
| main() |