66 lines
2.0 KiB
Python
Executable File
66 lines
2.0 KiB
Python
Executable File
#!/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()
|