~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/damon/damon_nr_regions.py

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #!/usr/bin/env python3
  2 # SPDX-License-Identifier: GPL-2.0
  3 
  4 import subprocess
  5 import time
  6 
  7 import _damon_sysfs
  8 
  9 def 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 using
 12     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 not
 15     kept.
 16     '''
 17     sz_region = 10 * 1024 * 1024
 18     proc = subprocess.Popen(['./access_memory_even', '%d' % real_nr_regions,
 19                              '%d' % sz_region])
 20 
 21     # stat every monitored regions
 22     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                     )] # schemes
 31                 )] # contexts
 32             )]) # kdamonds
 33 
 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             break
 63     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 or
 69         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 
 77 def main():
 78     # test min_nr_regions larger than real nr regions
 79     test_nr_regions(10, 20, 100)
 80 
 81     # test max_nr_regions smaller than real nr regions
 82     test_nr_regions(15, 3, 10)
 83 
 84     # test online-tuned max_nr_regions that smaller than real nr regions
 85     sz_region = 10 * 1024 * 1024
 86     proc = subprocess.Popen(['./access_memory_even', '14', '%d' % sz_region])
 87 
 88     # stat every monitored regions
 89     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                     )] # schemes
 97                 )] # contexts
 98             )]) # kdamonds
 99 
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 found
107     time.sleep(3)
108 
109     attrs = kdamonds.kdamonds[0].contexts[0].monitoring_attrs
110     attrs.min_nr_regions = 3
111     attrs.max_nr_regions = 7
112     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 executed
118     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 
144 if __name__ == '__main__':
145     main()

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php