#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0 import subprocess import time import _damon_sysfs def main(): # repeatedly access even-numbered ones in 14 regions of 10 MiB size sz_region = 10 * 1024 * 1024 proc = subprocess.Popen(['./access_memory_even', '14', '%d' % sz_region]) # stat every monitored regions kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond( contexts=[_damon_sysfs.DamonCtx( ops='vaddr', targets=[_damon_sysfs.DamonTarget(pid=proc.pid)], schemes=[_damon_sysfs.Damos(action='stat', )] # schemes )] # contexts )]) # kdamonds err = kdamonds.start() if err is not None: proc.terminate() print('kdamond start failed: %s' % err) exit(1) collected_nr_regions = [] while proc.poll() is None: time.sleep(0.1) err = kdamonds.kdamonds[0].update_schemes_tried_regions() if err is not None: proc.terminate() print('tried regions update failed: %s' % err) exit(1) scheme = kdamonds.kdamonds[0].contexts[0].schemes[0] if scheme.tried_regions is None: proc.terminate() print('tried regions is not collected') exit(1) nr_tried_regions = len(scheme.tried_regions) if nr_tried_regions <= 0: proc.terminate() print('tried regions is not created') exit(1) collected_nr_regions.append(nr_tried_regions) if len(collected_nr_regions) > 10: break proc.terminate() collected_nr_regions.sort() sample = collected_nr_regions[4] print('50-th percentile nr_regions: %d' % sample) print('expectation (>= 14) is %s' % 'met' if sample >= 14 else 'not met') if collected_nr_regions[4] < 14: print('full nr_regions:') print('\n'.join(collected_nr_regions)) exit(1) if __name__ == '__main__': main()