Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/damon: test no-op commit broke DAMON status

Add test to verify that DAMON status is not changed after a no-op commit.

[ekffu200098@gmail.com: change wrong json.dump usage to json.dumps]
Link: https://lkml.kernel.org/r/20250816014033.190451-1-ekffu200098@gmail.com
Link: https://lkml.kernel.org/r/20250810124354.16456-1-ekffu200098@gmail.com
Signed-off-by: Sang-Heon Jeon <ekffu200098@gmail.com>
Reviewed-by: SeongJae Park <sj@kernel.org>
Cc: Honggyu Kim <honggyu.kim@sk.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Sang-Heon Jeon and committed by
Andrew Morton
10725cd2 801295be

+73
+1
tools/testing/selftests/damon/Makefile
··· 18 18 TEST_PROGS += sysfs_update_removed_scheme_dir.sh 19 19 TEST_PROGS += sysfs_update_schemes_tried_regions_hang.py 20 20 TEST_PROGS += sysfs_memcg_path_leak.sh 21 + TEST_PROGS += sysfs_no_op_commit_break.py 21 22 22 23 EXTRA_CLEAN = __pycache__ 23 24
+72
tools/testing/selftests/damon/sysfs_no_op_commit_break.py
··· 1 + #!/usr/bin/env python3 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + import json 5 + import os 6 + import subprocess 7 + import sys 8 + 9 + import _damon_sysfs 10 + 11 + def dump_damon_status_dict(pid): 12 + try: 13 + subprocess.check_output(['which', 'drgn'], stderr=subprocess.DEVNULL) 14 + except: 15 + return None, 'drgn not found' 16 + file_dir = os.path.dirname(os.path.abspath(__file__)) 17 + dump_script = os.path.join(file_dir, 'drgn_dump_damon_status.py') 18 + rc = subprocess.call(['drgn', dump_script, pid, 'damon_dump_output'], 19 + stderr=subprocess.DEVNULL) 20 + 21 + if rc != 0: 22 + return None, f'drgn fail: return code({rc})' 23 + try: 24 + with open('damon_dump_output', 'r') as f: 25 + return json.load(f), None 26 + except Exception as e: 27 + return None, 'json.load fail (%s)' % e 28 + 29 + def main(): 30 + kdamonds = _damon_sysfs.Kdamonds( 31 + [_damon_sysfs.Kdamond( 32 + contexts=[_damon_sysfs.DamonCtx( 33 + schemes=[_damon_sysfs.Damos( 34 + ops_filters=[ 35 + _damon_sysfs.DamosFilter( 36 + type_='anon', 37 + matching=True, 38 + allow=True, 39 + ) 40 + ] 41 + )], 42 + )])] 43 + ) 44 + 45 + err = kdamonds.start() 46 + if err is not None: 47 + print('kdamond start failed: %s' % err) 48 + exit(1) 49 + 50 + before_commit_status, err = \ 51 + dump_damon_status_dict(kdamonds.kdamonds[0].pid) 52 + if err is not None: 53 + print('before-commit status dump failed: %s' % err) 54 + exit(1) 55 + 56 + kdamonds.kdamonds[0].commit() 57 + 58 + after_commit_status, err = \ 59 + dump_damon_status_dict(kdamonds.kdamonds[0].pid) 60 + if err is not None: 61 + print('after-commit status dump failed: %s' % err) 62 + exit(1) 63 + 64 + if before_commit_status != after_commit_status: 65 + print(f'before: {json.dumps(before_commit_status, indent=2)}') 66 + print(f'after: {json.dumps(after_commit_status, indent=2)}') 67 + exit(1) 68 + 69 + kdamonds.stop() 70 + 71 + if __name__ == '__main__': 72 + main()