146 lines · python
1#!/usr/bin/env python32# SPDX-License-Identifier: GPL-2.03 4import subprocess5import time6 7import _damon_sysfs8 9def test_nr_regions(real_nr_regions, min_nr_regions, max_nr_regions):10 '''11 Create process of the given 'real_nr_regions' regions, monitor it using12 DAMON with given '{min,max}_nr_regions' monitoring parameter.13 14 Exit with non-zero return code if the given {min,max}_nr_regions is not15 kept.16 '''17 sz_region = 10 * 1024 * 102418 proc = subprocess.Popen(['./access_memory_even', '%d' % real_nr_regions,19 '%d' % sz_region])20 21 # stat every monitored regions22 kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond(23 contexts=[_damon_sysfs.DamonCtx(24 monitoring_attrs=_damon_sysfs.DamonAttrs(25 min_nr_regions=min_nr_regions,26 max_nr_regions=max_nr_regions),27 ops='vaddr',28 targets=[_damon_sysfs.DamonTarget(pid=proc.pid)],29 schemes=[_damon_sysfs.Damos(action='stat',30 )] # schemes31 )] # contexts32 )]) # kdamonds33 34 err = kdamonds.start()35 if err is not None:36 proc.terminate()37 print('kdamond start failed: %s' % err)38 exit(1)39 40 collected_nr_regions = []41 while proc.poll() is None:42 time.sleep(0.1)43 err = kdamonds.kdamonds[0].update_schemes_tried_regions()44 if err is not None:45 proc.terminate()46 print('tried regions update failed: %s' % err)47 exit(1)48 49 scheme = kdamonds.kdamonds[0].contexts[0].schemes[0]50 if scheme.tried_regions is None:51 proc.terminate()52 print('tried regions is not collected')53 exit(1)54 55 nr_tried_regions = len(scheme.tried_regions)56 if nr_tried_regions <= 0:57 proc.terminate()58 print('tried regions is not created')59 exit(1)60 collected_nr_regions.append(nr_tried_regions)61 if len(collected_nr_regions) > 10:62 break63 proc.terminate()64 kdamonds.stop()65 66 test_name = 'nr_regions test with %d/%d/%d real/min/max nr_regions' % (67 real_nr_regions, min_nr_regions, max_nr_regions)68 if (collected_nr_regions[0] < min_nr_regions or69 collected_nr_regions[-1] > max_nr_regions):70 print('fail %s' % test_name)71 print('number of regions that collected are:')72 for nr in collected_nr_regions:73 print(nr)74 exit(1)75 print('pass %s ' % test_name)76 77def main():78 # test min_nr_regions larger than real nr regions79 test_nr_regions(10, 20, 100)80 81 # test max_nr_regions smaller than real nr regions82 test_nr_regions(15, 3, 10)83 84 # test online-tuned max_nr_regions that smaller than real nr regions85 sz_region = 10 * 1024 * 102486 proc = subprocess.Popen(['./access_memory_even', '14', '%d' % sz_region])87 88 # stat every monitored regions89 kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond(90 contexts=[_damon_sysfs.DamonCtx(91 monitoring_attrs=_damon_sysfs.DamonAttrs(92 min_nr_regions=10, max_nr_regions=1000),93 ops='vaddr',94 targets=[_damon_sysfs.DamonTarget(pid=proc.pid)],95 schemes=[_damon_sysfs.Damos(action='stat',96 )] # schemes97 )] # contexts98 )]) # kdamonds99 100 err = kdamonds.start()101 if err is not None:102 proc.terminate()103 print('kdamond start failed: %s' % err)104 exit(1)105 106 # wait until the real regions are found107 time.sleep(3)108 109 attrs = kdamonds.kdamonds[0].contexts[0].monitoring_attrs110 attrs.min_nr_regions = 3111 attrs.max_nr_regions = 7112 err = kdamonds.kdamonds[0].commit()113 if err is not None:114 proc.terminate()115 print('commit failed: %s' % err)116 exit(1)117 # wait for next merge operation is executed118 time.sleep(0.3)119 120 err = kdamonds.kdamonds[0].update_schemes_tried_regions()121 if err is not None:122 proc.terminate()123 print('tried regions update failed: %s' % err)124 exit(1)125 126 scheme = kdamonds.kdamonds[0].contexts[0].schemes[0]127 if scheme.tried_regions is None:128 proc.terminate()129 print('tried regions is not collected')130 exit(1)131 132 nr_tried_regions = len(scheme.tried_regions)133 if nr_tried_regions <= 0:134 proc.terminate()135 print('tried regions is not created')136 exit(1)137 proc.terminate()138 139 if nr_tried_regions > 7:140 print('fail online-tuned max_nr_regions: %d > 7' % nr_tried_regions)141 exit(1)142 print('pass online-tuned max_nr_regions')143 144if __name__ == '__main__':145 main()146