1#!/usr/bin/env python3 2# SPDX-License-Identifier: GPL-2.0 3 4import json 5import os 6import subprocess 7import sys 8 9import _damon_sysfs 10 11def dump_damon_status_dict(pid): 12 try: 13 subprocess.check_output(['which', 'drgn'], stderr=subprocess.DEVNULL) 14 except: 15 return None, 'drgn not found' 16 file_dir = os.path.dirname(os.path.abspath(__file__)) 17 dump_script = os.path.join(file_dir, 'drgn_dump_damon_status.py') 18 rc = subprocess.call(['drgn', dump_script, pid, 'damon_dump_output'], 19 stderr=subprocess.DEVNULL) 20 21 if rc != 0: 22 return None, f'drgn fail: return code({rc})' 23 try: 24 with open('damon_dump_output', 'r') as f: 25 return json.load(f), None 26 except Exception as e: 27 return None, 'json.load fail (%s)' % e 28 29def main(): 30 kdamonds = _damon_sysfs.Kdamonds( 31 [_damon_sysfs.Kdamond( 32 contexts=[_damon_sysfs.DamonCtx( 33 schemes=[_damon_sysfs.Damos( 34 ops_filters=[ 35 _damon_sysfs.DamosFilter( 36 type_='anon', 37 matching=True, 38 allow=True, 39 ) 40 ] 41 )], 42 )])] 43 ) 44 45 err = kdamonds.start() 46 if err is not None: 47 print('kdamond start failed: %s' % err) 48 exit(1) 49 50 before_commit_status, err = \ 51 dump_damon_status_dict(kdamonds.kdamonds[0].pid) 52 if err is not None: 53 print('before-commit status dump failed: %s' % err) 54 exit(1) 55 56 kdamonds.kdamonds[0].commit() 57 58 after_commit_status, err = \ 59 dump_damon_status_dict(kdamonds.kdamonds[0].pid) 60 if err is not None: 61 print('after-commit status dump failed: %s' % err) 62 exit(1) 63 64 if before_commit_status != after_commit_status: 65 print(f'before: {json.dumps(before_commit_status, indent=2)}') 66 print(f'after: {json.dumps(after_commit_status, indent=2)}') 67 exit(1) 68 69 kdamonds.stop() 70 71if __name__ == '__main__': 72 main() 73