brintos

brintos / linux-shallow public Read only

0
0
Text · 4.6 KiB · 2e8a74a Raw
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