73 lines
2.0 KiB
Python
Executable File
73 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
import _damon_sysfs
|
|
|
|
def dump_damon_status_dict(pid):
|
|
try:
|
|
subprocess.check_output(['which', 'drgn'], stderr=subprocess.DEVNULL)
|
|
except:
|
|
return None, 'drgn not found'
|
|
file_dir = os.path.dirname(os.path.abspath(__file__))
|
|
dump_script = os.path.join(file_dir, 'drgn_dump_damon_status.py')
|
|
rc = subprocess.call(['drgn', dump_script, pid, 'damon_dump_output'],
|
|
stderr=subprocess.DEVNULL)
|
|
|
|
if rc != 0:
|
|
return None, f'drgn fail: return code({rc})'
|
|
try:
|
|
with open('damon_dump_output', 'r') as f:
|
|
return json.load(f), None
|
|
except Exception as e:
|
|
return None, 'json.load fail (%s)' % e
|
|
|
|
def main():
|
|
kdamonds = _damon_sysfs.Kdamonds(
|
|
[_damon_sysfs.Kdamond(
|
|
contexts=[_damon_sysfs.DamonCtx(
|
|
schemes=[_damon_sysfs.Damos(
|
|
ops_filters=[
|
|
_damon_sysfs.DamosFilter(
|
|
type_='anon',
|
|
matching=True,
|
|
allow=True,
|
|
)
|
|
]
|
|
)],
|
|
)])]
|
|
)
|
|
|
|
err = kdamonds.start()
|
|
if err is not None:
|
|
print('kdamond start failed: %s' % err)
|
|
exit(1)
|
|
|
|
before_commit_status, err = \
|
|
dump_damon_status_dict(kdamonds.kdamonds[0].pid)
|
|
if err is not None:
|
|
print('before-commit status dump failed: %s' % err)
|
|
exit(1)
|
|
|
|
kdamonds.kdamonds[0].commit()
|
|
|
|
after_commit_status, err = \
|
|
dump_damon_status_dict(kdamonds.kdamonds[0].pid)
|
|
if err is not None:
|
|
print('after-commit status dump failed: %s' % err)
|
|
exit(1)
|
|
|
|
if before_commit_status != after_commit_status:
|
|
print(f'before: {json.dumps(before_commit_status, indent=2)}')
|
|
print(f'after: {json.dumps(after_commit_status, indent=2)}')
|
|
exit(1)
|
|
|
|
kdamonds.stop()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|