* [PATCH 0/2] fix damos_commit_ops_filters iteration problem with @ 2025-08-08 19:55 Sang-Heon Jeon 2025-08-08 19:55 ` [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status Sang-Heon Jeon 2025-08-08 19:55 ` [PATCH 2/2] mm/damon/core : fix commit_ops_filters by using correct nth function Sang-Heon Jeon 0 siblings, 2 replies; 10+ messages in thread From: Sang-Heon Jeon @ 2025-08-08 19:55 UTC (permalink / raw) To: sj, honggyu.kim; +Cc: damon, linux-mm, Sang-Heon Jeon While studying, I found a section in damos_commit_ops_filters() that looks like a bug. I first verified this issue through testing, and then modified the code to fix problem. After applying these patch set, the test which was added this time no longer fail. --- Sang-Heon Jeon (2): selftests/damon: test no-op commit broke DAMON status mm/damon/core : fix commit_ops_filters by using correct nth function mm/damon/core.c | 14 +++- tools/testing/selftests/damon/Makefile | 1 + .../damon/sysfs_no_op_commit_break.py | 78 +++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100755 tools/testing/selftests/damon/sysfs_no_op_commit_break.py -- 2.43.0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status 2025-08-08 19:55 [PATCH 0/2] fix damos_commit_ops_filters iteration problem with Sang-Heon Jeon @ 2025-08-08 19:55 ` Sang-Heon Jeon 2025-08-08 22:05 ` SeongJae Park 2025-08-08 19:55 ` [PATCH 2/2] mm/damon/core : fix commit_ops_filters by using correct nth function Sang-Heon Jeon 1 sibling, 1 reply; 10+ messages in thread From: Sang-Heon Jeon @ 2025-08-08 19:55 UTC (permalink / raw) To: sj, honggyu.kim; +Cc: damon, linux-mm, Sang-Heon Jeon Add test to verify that DAMON status is not changed after a no-op commit. Currently, it is failing. but after fix the bug it should be success. Signed-off-by: Sang-Heon Jeon <ekffu200098@gmail.com> --- tools/testing/selftests/damon/Makefile | 1 + .../damon/sysfs_no_op_commit_break.py | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100755 tools/testing/selftests/damon/sysfs_no_op_commit_break.py diff --git a/tools/testing/selftests/damon/Makefile b/tools/testing/selftests/damon/Makefile index 5b230deb19e8..44a4a819df55 100644 --- a/tools/testing/selftests/damon/Makefile +++ b/tools/testing/selftests/damon/Makefile @@ -17,6 +17,7 @@ TEST_PROGS += reclaim.sh lru_sort.sh TEST_PROGS += sysfs_update_removed_scheme_dir.sh TEST_PROGS += sysfs_update_schemes_tried_regions_hang.py TEST_PROGS += sysfs_memcg_path_leak.sh +TEST_PROGS += sysfs_no_op_commit_break.py EXTRA_CLEAN = __pycache__ diff --git a/tools/testing/selftests/damon/sysfs_no_op_commit_break.py b/tools/testing/selftests/damon/sysfs_no_op_commit_break.py new file mode 100755 index 000000000000..300cdbaa7eda --- /dev/null +++ b/tools/testing/selftests/damon/sysfs_no_op_commit_break.py @@ -0,0 +1,78 @@ +#!/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(): + # We can extend this test to change only the Given and reuse the When/Then. + + # Given : setup filter with allow = True + proc = subprocess.Popen(['sleep', '10']) + kdamonds = _damon_sysfs.Kdamonds( + [_damon_sysfs.Kdamond( + contexts=[_damon_sysfs.DamonCtx( + targets=[_damon_sysfs.DamonTarget(pid=proc.pid)], + 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(err) + exit(1) + + # When : No-op commit, it should not break anything + kdamonds.kdamonds[0].commit() + + # Then : Check value with drgn + after_commit_status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid) + if err is not None: + print(err) + exit(1) + + before_commit_dump = json.dumps(before_commit_status, sort_keys=True, indent=2) + after_commit_dump = json.dumps(after_commit_status, sort_keys=True, indent=2) + if before_commit_dump != after_commit_dump: + print("[TEST FAILED] : no-op commit break damon status") + print("===== before_commit =====") + print(before_commit_dump) + print("===== after_commit =====") + print(after_commit_dump) + exit(1) + + kdamonds.stop() + +if __name__ == '__main__': + main() -- 2.43.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status 2025-08-08 19:55 ` [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status Sang-Heon Jeon @ 2025-08-08 22:05 ` SeongJae Park 2025-08-09 6:27 ` Sang-Heon Jeon 2025-08-09 6:39 ` Sang-Heon Jeon 0 siblings, 2 replies; 10+ messages in thread From: SeongJae Park @ 2025-08-08 22:05 UTC (permalink / raw) To: Sang-Heon Jeon; +Cc: SeongJae Park, honggyu.kim, damon, linux-mm Hello Sang-Heon, On Sat, 9 Aug 2025 04:55:17 +0900 Sang-Heon Jeon <ekffu200098@gmail.com> wrote: > Add test to verify that DAMON status is not changed after a no-op > commit. Thank you for this patch! I have some comments below, though. > Currently, it is failing. but after fix the bug it should be > success. To keep bisecting goes smoothly, let's introduce failing tests _after_ their fixes are landed. > > Signed-off-by: Sang-Heon Jeon <ekffu200098@gmail.com> > --- > tools/testing/selftests/damon/Makefile | 1 + > .../damon/sysfs_no_op_commit_break.py | 78 +++++++++++++++++++ > 2 files changed, 79 insertions(+) > create mode 100755 tools/testing/selftests/damon/sysfs_no_op_commit_break.py > > diff --git a/tools/testing/selftests/damon/Makefile b/tools/testing/selftests/damon/Makefile > index 5b230deb19e8..44a4a819df55 100644 > --- a/tools/testing/selftests/damon/Makefile > +++ b/tools/testing/selftests/damon/Makefile > @@ -17,6 +17,7 @@ TEST_PROGS += reclaim.sh lru_sort.sh > TEST_PROGS += sysfs_update_removed_scheme_dir.sh > TEST_PROGS += sysfs_update_schemes_tried_regions_hang.py > TEST_PROGS += sysfs_memcg_path_leak.sh > +TEST_PROGS += sysfs_no_op_commit_break.py > > EXTRA_CLEAN = __pycache__ > > diff --git a/tools/testing/selftests/damon/sysfs_no_op_commit_break.py b/tools/testing/selftests/damon/sysfs_no_op_commit_break.py > new file mode 100755 > index 000000000000..300cdbaa7eda > --- /dev/null > +++ b/tools/testing/selftests/damon/sysfs_no_op_commit_break.py > @@ -0,0 +1,78 @@ > +#!/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})' Let's not add a space before ':', for the consistency. > + 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(): > + # We can extend this test to change only the Given and reuse the When/Then. Above comment seems unnecessary to me, since that's obvious. > + > + # Given : setup filter with allow = True Again, I don't think the above comment is necessary. And this looks like a pseudo code more than a formal comment. If you think it is necessary, please use more formal tone. Also let's not add a space before ':', for consistency. > + proc = subprocess.Popen(['sleep', '10']) > + kdamonds = _damon_sysfs.Kdamonds( > + [_damon_sysfs.Kdamond( > + contexts=[_damon_sysfs.DamonCtx( > + targets=[_damon_sysfs.DamonTarget(pid=proc.pid)], Can't we start this kdamond with paddr ops, and drop the 'sleep' process invocation? > + schemes=[_damon_sysfs.Damos( > + ops_filters=[ > + _damon_sysfs.DamosFilter(type_='anon', matching=True, allow=True) Let's keep 80 columns limit[1]. > + ] > + )], > + )])] > + ) > + > + 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(err) > + exit(1) > + > + # When : No-op commit, it should not break anything Again, I don't think the above comment is necessary. And this looks like a pseudo code more than a formal comment. If you think it is necessary, please use more formal tone. Also let's not add a space before ':', for consistency. > + kdamonds.kdamonds[0].commit() > + > + # Then : Check value with drgn Again, I don't think the above comment is necessary. And this looks like a pseudo code more than a formal comment. If you think it is necessary, please use more formal tone. Also let's not add a space before ':', for consistency. > + after_commit_status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid) > + if err is not None: > + print(err) > + exit(1) > + > + before_commit_dump = json.dumps(before_commit_status, sort_keys=True, indent=2) > + after_commit_dump = json.dumps(after_commit_status, sort_keys=True, indent=2) Let's keep 80 columns limit[1]. > + if before_commit_dump != after_commit_dump: Can't we jsut compare before_commit_status and after_commit_status? > + print("[TEST FAILED] : no-op commit break damon status") Let's not add a space before ':', for consistency. In this case, I think ':' is not necessary at all. Actually, since this test is for the single test case, and kselftest framework will say this failed, I think the above print() is not necessary at all? > + print("===== before_commit =====") > + print(before_commit_dump) > + print("===== after_commit =====") > + print(after_commit_dump) > + exit(1) > + > + kdamonds.stop() > + > +if __name__ == '__main__': > + main() > -- > 2.43.0 [1] https://docs.kernel.org/process/coding-style.html#breaking-long-lines-and-strings Thanks, SJ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status 2025-08-08 22:05 ` SeongJae Park @ 2025-08-09 6:27 ` Sang-Heon Jeon 2025-08-09 6:39 ` Sang-Heon Jeon 1 sibling, 0 replies; 10+ messages in thread From: Sang-Heon Jeon @ 2025-08-09 6:27 UTC (permalink / raw) To: SeongJae Park; +Cc: honggyu.kim, damon, linux-mm [-- Attachment #1: Type: text/plain, Size: 7608 bytes --] Hi SeongJae On Sat, Aug 9, 2025 at 7:05 AM SeongJae Park <sj@kernel.org> wrote: > > Hello Sang-Heon, > > On Sat, 9 Aug 2025 04:55:17 +0900 Sang-Heon Jeon <ekffu200098@gmail.com> wrote: > > > Add test to verify that DAMON status is not changed after a no-op > > commit. > > Thank you for this patch! I have some comments below, though. > > > Currently, it is failing. but after fix the bug it should be > > success. > > To keep bisecting goes smoothly, let's introduce failing tests _after_ their > fixes are landed. I see. As mentioned in another comment, I'll merge this patch set into one patch. I think this comment will be resolved then. > > > > Signed-off-by: Sang-Heon Jeon <ekffu200098@gmail.com> > > --- > > tools/testing/selftests/damon/Makefile | 1 + > > .../damon/sysfs_no_op_commit_break.py | 78 +++++++++++++++++++ > > 2 files changed, 79 insertions(+) > > create mode 100755 tools/testing/selftests/damon/sysfs_no_op_commit_break.py > > > > diff --git a/tools/testing/selftests/damon/Makefile b/tools/testing/selftests/damon/Makefile > > index 5b230deb19e8..44a4a819df55 100644 > > --- a/tools/testing/selftests/damon/Makefile > > +++ b/tools/testing/selftests/damon/Makefile > > @@ -17,6 +17,7 @@ TEST_PROGS += reclaim.sh lru_sort.sh > > TEST_PROGS += sysfs_update_removed_scheme_dir.sh > > TEST_PROGS += sysfs_update_schemes_tried_regions_hang.py > > TEST_PROGS += sysfs_memcg_path_leak.sh > > +TEST_PROGS += sysfs_no_op_commit_break.py > > > > EXTRA_CLEAN = __pycache__ > > > > diff --git a/tools/testing/selftests/damon/sysfs_no_op_commit_break.py b/tools/testing/selftests/damon/sysfs_no_op_commit_break.py > > new file mode 100755 > > index 000000000000..300cdbaa7eda > > --- /dev/null > > +++ b/tools/testing/selftests/damon/sysfs_no_op_commit_break.py > > @@ -0,0 +1,78 @@ > > +#!/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})' > > Let's not add a space before ':', for the consistency. I see. I made so many mistakes like these; (I worked this very late night...) I will fix them all. Thank you for checking this moment. > > + 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(): > > + # We can extend this test to change only the Given and reuse the When/Then. > > Above comment seems unnecessary to me, since that's obvious. I agree. As you said, it is obvious. I'll remove all pseudo like comment. > > + > > + # Given : setup filter with allow = True > > Again, I don't think the above comment is necessary. And this looks like a > pseudo code more than a formal comment. If you think it is necessary, please > use more formal tone. > > Also let's not add a space before ':', for consistency. > > > + proc = subprocess.Popen(['sleep', '10']) > > + kdamonds = _damon_sysfs.Kdamonds( > > + [_damon_sysfs.Kdamond( > > + contexts=[_damon_sysfs.DamonCtx( > > + targets=[_damon_sysfs.DamonTarget(pid=proc.pid)], > > Can't we start this kdamond with paddr ops, and drop the 'sleep' process > invocation? I just referred other tests. And i think we can remove unnecessary targets and sleep process. I'll fix it on v2 patch. > > + schemes=[_damon_sysfs.Damos( > > + ops_filters=[ > > + _damon_sysfs.DamosFilter(type_='anon', matching=True, allow=True) > > Let's keep 80 columns limit[1]. Oh, I thought it only applied to 'C' related codes. I'm wrong. Thank you for reminding me. i'll fix it. > > + ] > > + )], > > + )])] > > + ) > > + > > + 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(err) > > + exit(1) > > + > > + # When : No-op commit, it should not break anything > > Again, I don't think the above comment is necessary. And this looks like a > pseudo code more than a formal comment. If you think it is necessary, please > use more formal tone. ditto (wil be removed) > Also let's not add a space before ':', for consistency. > > > + kdamonds.kdamonds[0].commit() > > + > > + # Then : Check value with drgn > > Again, I don't think the above comment is necessary. And this looks like a > pseudo code more than a formal comment. If you think it is necessary, please > use more formal tone. > > Also let's not add a space before ':', for consistency. ditto. > > + after_commit_status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid) > > + if err is not None: > > + print(err) > > + exit(1) > > + > > + before_commit_dump = json.dumps(before_commit_status, sort_keys=True, indent=2) > > + after_commit_dump = json.dumps(after_commit_status, sort_keys=True, indent=2) > > Let's keep 80 columns limit[1]. ditto. > > + if before_commit_dump != after_commit_dump: > > Can't we jsut compare before_commit_status and after_commit_status? Yeah, I think i'm just confused. I'll change it. > > + print("[TEST FAILED] : no-op commit break damon status") > > Let's not add a space before ':', for consistency. In this case, I think ':' > is not necessary at all. Actually, since this test is for the single test > case, and kselftest framework will say this failed, I think the above print() > is not necessary at all? So, kselftest framework identifies whether the test was successful or not by exit code. Then, i'll remove this one. To be honest, I didn't use kselftest framework while making these patch set because I don't know how kernel developers use it. If you are okay, could you share how you use it? I just build kernel with custom patch, and execute output images by vm, and setup env, then just execute tests(it's so raw.. i know) Maybe is there a kernel build option that automatically includes tests to output image? Or just a general or smarter way to execute the whole test? > > + print("===== before_commit =====") > > + print(before_commit_dump) > > + print("===== after_commit =====") > > + print(after_commit_dump) > > + exit(1) > > + > > + kdamonds.stop() > > + > > +if __name__ == '__main__': > > + main() > > -- > > 2.43.0 > > [1] https://docs.kernel.org/process/coding-style.html#breaking-long-lines-and-strings > > > Thanks, > SJ Thanks for reviewing! Have a nice weekend. I'll do this job after my personal schedule finishes. Best Regards. Sang-Heon Jeon Sang-Heon Jeon [-- Attachment #2: Type: text/html, Size: 10559 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status 2025-08-08 22:05 ` SeongJae Park 2025-08-09 6:27 ` Sang-Heon Jeon @ 2025-08-09 6:39 ` Sang-Heon Jeon 2025-08-09 17:35 ` SeongJae Park 1 sibling, 1 reply; 10+ messages in thread From: Sang-Heon Jeon @ 2025-08-09 6:39 UTC (permalink / raw) To: SeongJae Park; +Cc: honggyu.kim, damon, linux-mm Hi SeongJae On Sat, Aug 9, 2025 at 7:05 AM SeongJae Park <sj@kernel.org> wrote: > > Hello Sang-Heon, > > On Sat, 9 Aug 2025 04:55:17 +0900 Sang-Heon Jeon <ekffu200098@gmail.com> wrote: > > > Add test to verify that DAMON status is not changed after a no-op > > commit. > > Thank you for this patch! I have some comments below, though. > > > Currently, it is failing. but after fix the bug it should be > > success. > > To keep bisecting goes smoothly, let's introduce failing tests _after_ their > fixes are landed. I see. As mentioned in another comment, I'll merge this patch set into one patch. I think this comment will be resolved then. > > > > Signed-off-by: Sang-Heon Jeon <ekffu200098@gmail.com> > > --- > > tools/testing/selftests/damon/Makefile | 1 + > > .../damon/sysfs_no_op_commit_break.py | 78 +++++++++++++++++++ > > 2 files changed, 79 insertions(+) > > create mode 100755 tools/testing/selftests/damon/sysfs_no_op_commit_break.py > > > > diff --git a/tools/testing/selftests/damon/Makefile b/tools/testing/selftests/damon/Makefile > > index 5b230deb19e8..44a4a819df55 100644 > > --- a/tools/testing/selftests/damon/Makefile > > +++ b/tools/testing/selftests/damon/Makefile > > @@ -17,6 +17,7 @@ TEST_PROGS += reclaim.sh lru_sort.sh > > TEST_PROGS += sysfs_update_removed_scheme_dir.sh > > TEST_PROGS += sysfs_update_schemes_tried_regions_hang.py > > TEST_PROGS += sysfs_memcg_path_leak.sh > > +TEST_PROGS += sysfs_no_op_commit_break.py > > > > EXTRA_CLEAN = __pycache__ > > > > diff --git a/tools/testing/selftests/damon/sysfs_no_op_commit_break.py b/tools/testing/selftests/damon/sysfs_no_op_commit_break.py > > new file mode 100755 > > index 000000000000..300cdbaa7eda > > --- /dev/null > > +++ b/tools/testing/selftests/damon/sysfs_no_op_commit_break.py > > @@ -0,0 +1,78 @@ > > +#!/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})' > > Let's not add a space before ':', for the consistency. I see. I made so many mistakes like these; (I worked this very late night...) I will fix them all. Thank you for checking this moment. > > + 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(): > > + # We can extend this test to change only the Given and reuse the When/Then. > > Above comment seems unnecessary to me, since that's obvious. I agree. As you said, it is obvious. I'll remove all pseudo like comment. > > + > > + # Given : setup filter with allow = True > > Again, I don't think the above comment is necessary. And this looks like a > pseudo code more than a formal comment. If you think it is necessary, please > use more formal tone. > > Also let's not add a space before ':', for consistency. > > > + proc = subprocess.Popen(['sleep', '10']) > > + kdamonds = _damon_sysfs.Kdamonds( > > + [_damon_sysfs.Kdamond( > > + contexts=[_damon_sysfs.DamonCtx( > > + targets=[_damon_sysfs.DamonTarget(pid=proc.pid)], > > Can't we start this kdamond with paddr ops, and drop the 'sleep' process > invocation? I just referred other tests. And i think we can remove unnecessary targets and sleep process. I'll fix it on v2 patch. > > + schemes=[_damon_sysfs.Damos( > > + ops_filters=[ > > + _damon_sysfs.DamosFilter(type_='anon', matching=True, allow=True) > > Let's keep 80 columns limit[1]. Oh, I thought it only applied to 'C' related codes. I'm wrong. Thank you for reminding me. i'll fix it. > > + ] > > + )], > > + )])] > > + ) > > + > > + 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(err) > > + exit(1) > > + > > + # When : No-op commit, it should not break anything > > Again, I don't think the above comment is necessary. And this looks like a > pseudo code more than a formal comment. If you think it is necessary, please > use more formal tone. > Also let's not add a space before ':', for consistency. > ditto (wil be removed) > > + kdamonds.kdamonds[0].commit() > > + > > + # Then : Check value with drgn > > Again, I don't think the above comment is necessary. And this looks like a > pseudo code more than a formal comment. If you think it is necessary, please > use more formal tone. > > Also let's not add a space before ':', for consistency. ditto. > > + after_commit_status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid) > > + if err is not None: > > + print(err) > > + exit(1) > > + > > + before_commit_dump = json.dumps(before_commit_status, sort_keys=True, indent=2) > > + after_commit_dump = json.dumps(after_commit_status, sort_keys=True, indent=2) > > Let's keep 80 columns limit[1]. ditto. > > + if before_commit_dump != after_commit_dump: > > Can't we jsut compare before_commit_status and after_commit_status? Yeah, I think i'm just confused. I'll change it. > > + print("[TEST FAILED] : no-op commit break damon status") > > Let's not add a space before ':', for consistency. In this case, I think ':' > is not necessary at all. Actually, since this test is for the single test > case, and kselftest framework will say this failed, I think the above print() > is not necessary at all? So, kselftest framework identifies whether the test was successful or not by exit code. Then, i'll remove this one. To be honest, I didn't use kselftest framework while making these patch set because I don't know how kernel developers use it. If you are okay, could you share how you use it? I just build kernel with custom patch, and execute output images by vm, and setup env, then just execute tests(it's so raw.. i know) Maybe is there a kernel build option that automatically includes tests to output image? Or just a general or smarter way to execute the whole test? > > + print("===== before_commit =====") > > + print(before_commit_dump) > > + print("===== after_commit =====") > > + print(after_commit_dump) > > + exit(1) > > + > > + kdamonds.stop() > > + > > +if __name__ == '__main__': > > + main() > > -- > > 2.43.0 > > [1] https://docs.kernel.org/process/coding-style.html#breaking-long-lines-and-strings > > > Thanks, > SJ Thanks for reviewing! Have a nice weekend. I'll do this job after my personal schedule finishes. Best Regards. Sang-Heon Jeon ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status 2025-08-09 6:39 ` Sang-Heon Jeon @ 2025-08-09 17:35 ` SeongJae Park 2025-08-10 5:43 ` Sang-Heon Jeon 0 siblings, 1 reply; 10+ messages in thread From: SeongJae Park @ 2025-08-09 17:35 UTC (permalink / raw) To: Sang-Heon Jeon; +Cc: SeongJae Park, honggyu.kim, damon, linux-mm On Sat, 9 Aug 2025 15:39:41 +0900 Sang-Heon Jeon <ekffu200098@gmail.com> wrote: > Hi SeongJae > > On Sat, Aug 9, 2025 at 7:05 AM SeongJae Park <sj@kernel.org> wrote: > > > > Hello Sang-Heon, > > > > On Sat, 9 Aug 2025 04:55:17 +0900 Sang-Heon Jeon <ekffu200098@gmail.com> wrote: > > > > > Add test to verify that DAMON status is not changed after a no-op > > > commit. > > > > Thank you for this patch! I have some comments below, though. > > > > > Currently, it is failing. but after fix the bug it should be > > > success. > > > > To keep bisecting goes smoothly, let's introduce failing tests _after_ their > > fixes are landed. > > I see. As mentioned in another comment, I'll merge this patch set into > one patch. I think this comment will be resolved then. That could make the patch be unnecessarily difficult to apply on older kernels due to the test part. Please keep those separated. [...] > > > + if rc != 0: > > > + return None, f'drgn fail : return code({rc})' > > > > Let's not add a space before ':', for the consistency. > > I see. I made so many mistakes like these; (I worked this very late > night...) I will fix them all. Thank you for checking this moment. I'm sorry to hear that you had to work on late night :'( I hope you to have sufficient rests. [...] > To be honest, I didn't use kselftest framework while making these > patch set because I don't know how kernel developers use it. > > If you are okay, could you share how you use it? Sure. I do below for running DAMON selftests. $ sudo make -C tools/testing/selftests/damon run_tsets You could also run DAMON kunit tests like below. $ ./tools/testing/kunit/kunit.py run --kunitconfig mm/damon/tests/ I usually run all those together with additional tests, using DAMON tests suite[2]. > I just build kernel > with custom patch, and execute output images by vm, and setup env, > then just execute tests(it's so raw.. i know) It's ok. No one fits all, so different tests are needed for different hacks. Please keep using whatever works best for you :) > > Maybe is there a kernel build option that automatically includes tests > to output image? Or just a general or smarter way to execute the whole > test? To be honest I'm also not an expert of kselftest and kunit :) You coule refer to the kselftest documentation[1] for more details. [...] > Thanks for reviewing! Have a nice weekend. I'll do this job after my > personal schedule finishes. No worry, take your time and fun! :) [...] [1] https://docs.kernel.org/dev-tools/kselftest.html [2] https://github.com/damonitor/damon-tests/blob/master/corr/run.sh Thanks, SJ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status 2025-08-09 17:35 ` SeongJae Park @ 2025-08-10 5:43 ` Sang-Heon Jeon 0 siblings, 0 replies; 10+ messages in thread From: Sang-Heon Jeon @ 2025-08-10 5:43 UTC (permalink / raw) To: SeongJae Park; +Cc: honggyu.kim, damon, linux-mm Hi SeongJae On Sun, Aug 10, 2025 at 2:36 AM SeongJae Park <sj@kernel.org> wrote: > > On Sat, 9 Aug 2025 15:39:41 +0900 Sang-Heon Jeon <ekffu200098@gmail.com> wrote: > > > Hi SeongJae > > > > On Sat, Aug 9, 2025 at 7:05 AM SeongJae Park <sj@kernel.org> wrote: > > > > > > Hello Sang-Heon, > > > > > > On Sat, 9 Aug 2025 04:55:17 +0900 Sang-Heon Jeon <ekffu200098@gmail.com> wrote: > > > > > > > Add test to verify that DAMON status is not changed after a no-op > > > > commit. > > > > > > Thank you for this patch! I have some comments below, though. > > > > > > > Currently, it is failing. but after fix the bug it should be > > > > success. > > > > > > To keep bisecting goes smoothly, let's introduce failing tests _after_ their > > > fixes are landed. > > > > I see. As mentioned in another comment, I'll merge this patch set into > > one patch. I think this comment will be resolved then. > > That could make the patch be unnecessarily difficult to apply on older kernels > due to the test part. Please keep those separated. Oh, I misunderstand your previous comment. Now, I understand your point. I'll separate them back and make two v3 patch(one for fix bug, one for test) not a patch set. Thanks for the explanation, I feel like I'm learning more and more. > [...] > > > > + if rc != 0: > > > > + return None, f'drgn fail : return code({rc})' > > > > > > Let's not add a space before ':', for the consistency. > > > > I see. I made so many mistakes like these; (I worked this very late > > night...) I will fix them all. Thank you for checking this moment. > > I'm sorry to hear that you had to work on late night :'( I hope you to have > sufficient rests. Never mind. just I went with that :) Thanks as always. > [...] > > To be honest, I didn't use kselftest framework while making these > > patch set because I don't know how kernel developers use it. > > > > If you are okay, could you share how you use it? > > Sure. I do below for running DAMON selftests. > > $ sudo make -C tools/testing/selftests/damon run_tsets > > You could also run DAMON kunit tests like below. > > $ ./tools/testing/kunit/kunit.py run --kunitconfig mm/damon/tests/ Thanks for sharing. I'll try it with my vm environment. > I usually run all those together with additional tests, using DAMON tests > suite[2]. > > > I just build kernel > > with custom patch, and execute output images by vm, and setup env, > > then just execute tests(it's so raw.. i know) > > It's ok. No one fits all, so different tests are needed for different hacks. > Please keep using whatever works best for you :) You're so right. Maybe I just want to learn some tips from the experts. haha > > > > Maybe is there a kernel build option that automatically includes tests > > to output image? Or just a general or smarter way to execute the whole > > test? > > To be honest I'm also not an expert of kselftest and kunit :) You coule refer > to the kselftest documentation[1] for more details. Thanks for sharing! > [...] > > Thanks for reviewing! Have a nice weekend. I'll do this job after my > > personal schedule finishes. > > No worry, take your time and fun! :) > [...] :) > [1] https://docs.kernel.org/dev-tools/kselftest.html > [2] https://github.com/damonitor/damon-tests/blob/master/corr/run.sh > > > Thanks, > SJ Best Regards. Sang-Heon Jeon ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/2] mm/damon/core : fix commit_ops_filters by using correct nth function 2025-08-08 19:55 [PATCH 0/2] fix damos_commit_ops_filters iteration problem with Sang-Heon Jeon 2025-08-08 19:55 ` [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status Sang-Heon Jeon @ 2025-08-08 19:55 ` Sang-Heon Jeon 2025-08-08 22:08 ` SeongJae Park 1 sibling, 1 reply; 10+ messages in thread From: Sang-Heon Jeon @ 2025-08-08 19:55 UTC (permalink / raw) To: sj, honggyu.kim; +Cc: damon, linux-mm, Sang-Heon Jeon damos_commit_ops_filters() incorrectly uses damos_nth_filter() which iterates core_filters. As a result, performing a commit unintentionally corrupts ops_filters. Add damos_nth_ops_filter() which iterates ops_filters. Use this function to fix issues caused by wrong iteration. Signed-off-by: Sang-Heon Jeon <ekffu200098@gmail.com> --- mm/damon/core.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/mm/damon/core.c b/mm/damon/core.c index 883d791a10e5..19c8f01fc81a 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -862,6 +862,18 @@ static struct damos_filter *damos_nth_filter(int n, struct damos *s) return NULL; } +static struct damos_filter *damos_nth_ops_filter(int n, struct damos *s) +{ + struct damos_filter *filter; + int i = 0; + + damos_for_each_ops_filter(filter, s) { + if (i++ == n) + return filter; + } + return NULL; +} + static void damos_commit_filter_arg( struct damos_filter *dst, struct damos_filter *src) { @@ -925,7 +937,7 @@ static int damos_commit_ops_filters(struct damos *dst, struct damos *src) int i = 0, j = 0; damos_for_each_ops_filter_safe(dst_filter, next, dst) { - src_filter = damos_nth_filter(i++, src); + src_filter = damos_nth_ops_filter(i++, src); if (src_filter) damos_commit_filter(dst_filter, src_filter); else -- 2.43.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] mm/damon/core : fix commit_ops_filters by using correct nth function 2025-08-08 19:55 ` [PATCH 2/2] mm/damon/core : fix commit_ops_filters by using correct nth function Sang-Heon Jeon @ 2025-08-08 22:08 ` SeongJae Park 2025-08-08 23:26 ` SeongJae Park 0 siblings, 1 reply; 10+ messages in thread From: SeongJae Park @ 2025-08-08 22:08 UTC (permalink / raw) To: Sang-Heon Jeon Cc: SeongJae Park, honggyu.kim, damon, linux-mm, Andrew Morton, stable On Sat, 9 Aug 2025 04:55:18 +0900 Sang-Heon Jeon <ekffu200098@gmail.com> wrote: > damos_commit_ops_filters() incorrectly uses damos_nth_filter() which > iterates core_filters. As a result, performing a commit unintentionally > corrupts ops_filters. > > Add damos_nth_ops_filter() which iterates ops_filters. Use this function > to fix issues caused by wrong iteration. Thank you for finding and fixing this bug! Since this bug is better to be fixed as soon as possible, could you please send the next version of this patch as an individual one, rather than as a part of this patchset? > > Signed-off-by: Sang-Heon Jeon <ekffu200098@gmail.com> Let's add below for stable kernel maintainers[1]. Fixes: 3607cc590f18 ("mm/damon/core: support committing ops_filters") # 6.15.x Cc: stable@vger.kernel.org And the fix looks good to me, so Reviewed-by: SeongJae Park <sj@kernel.org> [...] [1] https://docs.kernel.org/process/stable-kernel-rules.html Thanks, SJ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] mm/damon/core : fix commit_ops_filters by using correct nth function 2025-08-08 22:08 ` SeongJae Park @ 2025-08-08 23:26 ` SeongJae Park 0 siblings, 0 replies; 10+ messages in thread From: SeongJae Park @ 2025-08-08 23:26 UTC (permalink / raw) To: SeongJae Park Cc: Sang-Heon Jeon, honggyu.kim, damon, linux-mm, Andrew Morton, stable Forgot saying this, sorry. Please update the subject to not have a space before ':', for consistency. Thanks, SJ [...] ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-08-10 5:43 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-08-08 19:55 [PATCH 0/2] fix damos_commit_ops_filters iteration problem with Sang-Heon Jeon 2025-08-08 19:55 ` [PATCH 1/2] selftests/damon: test no-op commit broke DAMON status Sang-Heon Jeon 2025-08-08 22:05 ` SeongJae Park 2025-08-09 6:27 ` Sang-Heon Jeon 2025-08-09 6:39 ` Sang-Heon Jeon 2025-08-09 17:35 ` SeongJae Park 2025-08-10 5:43 ` Sang-Heon Jeon 2025-08-08 19:55 ` [PATCH 2/2] mm/damon/core : fix commit_ops_filters by using correct nth function Sang-Heon Jeon 2025-08-08 22:08 ` SeongJae Park 2025-08-08 23:26 ` SeongJae Park
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).