1#!/usr/bin/env python3 2# SPDX-License-Identifier: GPL-2.0 3 4import subprocess 5import time 6 7import _damon_sysfs 8 9def main(): 10 # repeatedly access even-numbered ones in 14 regions of 10 MiB size 11 sz_region = 10 * 1024 * 1024 12 proc = subprocess.Popen(['./access_memory_even', '14', '%d' % sz_region]) 13 14 # stat every monitored regions 15 kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond( 16 contexts=[_damon_sysfs.DamonCtx( 17 ops='vaddr', 18 targets=[_damon_sysfs.DamonTarget(pid=proc.pid)], 19 schemes=[_damon_sysfs.Damos(action='stat', 20 )] # schemes 21 )] # contexts 22 )]) # kdamonds 23 24 err = kdamonds.start() 25 if err is not None: 26 proc.terminate() 27 print('kdamond start failed: %s' % err) 28 exit(1) 29 30 collected_nr_regions = [] 31 while proc.poll() is None: 32 time.sleep(0.1) 33 err = kdamonds.kdamonds[0].update_schemes_tried_regions() 34 if err is not None: 35 proc.terminate() 36 print('tried regions update failed: %s' % err) 37 exit(1) 38 39 scheme = kdamonds.kdamonds[0].contexts[0].schemes[0] 40 if scheme.tried_regions is None: 41 proc.terminate() 42 print('tried regions is not collected') 43 exit(1) 44 45 nr_tried_regions = len(scheme.tried_regions) 46 if nr_tried_regions <= 0: 47 proc.terminate() 48 print('tried regions is not created') 49 exit(1) 50 collected_nr_regions.append(nr_tried_regions) 51 if len(collected_nr_regions) > 10: 52 break 53 proc.terminate() 54 55 collected_nr_regions.sort() 56 sample = collected_nr_regions[4] 57 print('50-th percentile nr_regions: %d' % sample) 58 print('expectation (>= 14) is %s' % 'met' if sample >= 14 else 'not met') 59 if collected_nr_regions[4] < 14: 60 print('full nr_regions:') 61 print('\n'.join(collected_nr_regions)) 62 exit(1) 63 64if __name__ == '__main__': 65 main() 66