* [PATCH 01/11] Docs/mm/damon/design: update for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 02/11] Docs/ABI/damon: document probe files SJ Park
` (10 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton
Cc: SJ Park, Liam R. Howlett, David Hildenbrand, Jonathan Corbet,
Lorenzo Stoakes, Michal Hocko, Mike Rapoport, Shuah Khan,
Suren Baghdasaryan, Vlastimil Babka, damon, linux-doc,
linux-kernel, linux-mm
Commit 9138e27a3bc3 ("mm/damon: add node_eligible_mem_bp goal metric")
introduced DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP but forgot updating the
DAMON design document for that. Update.
Signed-off-by: SJ Park <sj@kernel.org>
---
Documentation/mm/damon/design.rst | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/design.rst
index c16a3bb288d07..457d6e8bc7878 100644
--- a/Documentation/mm/damon/design.rst
+++ b/Documentation/mm/damon/design.rst
@@ -686,9 +686,11 @@ mechanism tries to make ``current_value`` of ``target_metric`` be same to
(1/10,000).
- ``inactive_mem_bp``: Inactive to active + inactive (LRU) memory size ratio in
bp (1/10,000).
+- ``node_eligible_mem_bp``: Scheme target access pattern-eligible memory ratio
+ of a node in bp (1/10,000).
-``nid`` is optionally required for only ``node_mem_used_bp``,
-``node_mem_free_bp``, ``node_memcg_used_bp`` and ``node_memcg_free_bp`` to
+``nid`` is optionally required for ``node_mem_used_bp``, ``node_mem_free_bp``,
+``node_memcg_used_bp``, ``node_memcg_free_bp`` and ``node_eligible_mem_bp`` to
point the specific NUMA node.
``path`` is optionally required for only ``node_memcg_used_bp`` and
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 02/11] Docs/ABI/damon: document probe files
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
2026-06-30 14:17 ` [PATCH 01/11] Docs/mm/damon/design: update for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 03/11] mm/damon/tests/core-kunit: test damon_rand() SJ Park
` (9 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton
Cc: SJ Park, Liam R. Howlett, David Hildenbrand, Lorenzo Stoakes,
Michal Hocko, Mike Rapoport, Suren Baghdasaryan, Vlastimil Babka,
damon, linux-kernel, linux-mm
DAMON ABI document is not updated for the DAMON probe sysfs files.
Update.
Signed-off-by: SJ Park <sj@kernel.org>
---
.../ABI/testing/sysfs-kernel-mm-damon | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-kernel-mm-damon b/Documentation/ABI/testing/sysfs-kernel-mm-damon
index 4fdec63a47d4a..dd6b5bd76e119 100644
--- a/Documentation/ABI/testing/sysfs-kernel-mm-damon
+++ b/Documentation/ABI/testing/sysfs-kernel-mm-damon
@@ -157,6 +157,46 @@ Description: Writing a value to this file sets the maximum number of
monitoring regions of the DAMON context as the value. Reading
this file returns the value.
+What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/monitoring_attrs/probes/nr_probes
+Date: May 2026
+Contact: SJ Park <sj@kernel.org>
+Description: Writing a number 'N' to this file creates the number of
+ directories for each DAMON probe named '0' to 'N-1' under the
+ probes/ directory.
+
+What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/monitoring_attrs/probes/<P>/filters/nr_filters
+Date: May 2026
+Contact: SJ Park <sj@kernel.org>
+Description: Writing a number 'N' to this file creates the number of
+ directories for each DAMON probe filter named '0' to 'N-1'
+ under the filters/ directory.
+
+What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/monitoring_attrs/probes/<P>/filters/<F>/type
+Date: May 2026
+Contact: SJ Park <sj@kernel.org>
+Description: Writing to and reading from this file sets and gets the type of
+ the memory of the interest.
+
+What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/monitoring_attrs/probes/<P>/filters/<F>/path
+Date: May 2026
+Contact: SJ Park <sj@kernel.org>
+Description: If 'memcg' is written to the 'type' file, writing to and
+ reading from this file sets and gets the path to the memory
+ cgroup of the interest.
+
+What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/monitoring_attrs/probes/<P>/filters/<F>/matching
+Date: May 2026
+Contact: SJ Park <sj@kernel.org>
+Description: Writing 'Y' or 'N' to this file sets whether the filter is for
+ the memory of the 'type', or all except the 'type'.
+
+What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/monitoring_attrs/probes/<P>/filters/<F>/allow
+Date: May 2026
+Contact: SJ Park <sj@kernel.org>
+Description: Writing 'Y' or 'N' to this file sets whether to allow or reject
+ hitting the probe for the memory that satisfies the 'type' and
+ the 'matching' of the directory.
+
What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/targets/nr_targets
Date: Mar 2022
Contact: SJ Park <sj@kernel.org>
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 03/11] mm/damon/tests/core-kunit: test damon_rand()
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
2026-06-30 14:17 ` [PATCH 01/11] Docs/mm/damon/design: update for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP SJ Park
2026-06-30 14:17 ` [PATCH 02/11] Docs/ABI/damon: document probe files SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:25 ` sashiko-bot
2026-06-30 14:17 ` [PATCH 04/11] selftests/damon/sysfs.sh: test multiple probe dirs creation SJ Park
` (8 subsequent siblings)
11 siblings, 1 reply; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton
Cc: SJ Park, Brendan Higgins, David Gow, damon, kunit-dev,
linux-kernel, linux-kselftest, linux-mm
Commit 9012c4e647df ("mm/damon: replace damon_rand() with a per-ctx
lockless PRNG") optimized DAMON for better performance. Add a kunit
test for ensuring the bounds of the output.
Signed-off-by: SJ Park <sj@kernel.org>
---
mm/damon/tests/core-kunit.h | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
index aef7e0553cba4..0124f83b39b83 100644
--- a/mm/damon/tests/core-kunit.h
+++ b/mm/damon/tests/core-kunit.h
@@ -1547,6 +1547,20 @@ static void damon_test_walk_control_obsolete(struct kunit *test)
damon_destroy_ctx(ctx);
}
+static void damon_test_rand(struct kunit *test)
+{
+ struct damon_ctx ctx;
+ int i;
+
+ prandom_seed_state(&ctx.rnd_state, get_random_u64());
+ for (i = 0; i < 10000; i++) {
+ unsigned long rnd = damon_rand(&ctx, 0, 10);
+
+ KUNIT_EXPECT_GE(test, rnd, 0);
+ KUNIT_EXPECT_LE(test, rnd, 9);
+ }
+}
+
static struct kunit_case damon_test_cases[] = {
KUNIT_CASE(damon_test_target),
KUNIT_CASE(damon_test_regions),
@@ -1578,6 +1592,7 @@ static struct kunit_case damon_test_cases[] = {
KUNIT_CASE(damon_test_apply_min_nr_regions),
KUNIT_CASE(damon_test_is_last_region),
KUNIT_CASE(damon_test_walk_control_obsolete),
+ KUNIT_CASE(damon_test_rand),
{},
};
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH 03/11] mm/damon/tests/core-kunit: test damon_rand()
2026-06-30 14:17 ` [PATCH 03/11] mm/damon/tests/core-kunit: test damon_rand() SJ Park
@ 2026-06-30 14:25 ` sashiko-bot
2026-06-30 14:54 ` SJ Park
0 siblings, 1 reply; 15+ messages in thread
From: sashiko-bot @ 2026-06-30 14:25 UTC (permalink / raw)
To: SJ Park; +Cc: damon
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] The lower bound check `KUNIT_EXPECT_GE(test, rnd, 0)` is a tautology and fails to test the lower bound offset logic.
- [Low] The test completely misses the 64-bit slow path of `damon_rand()`.
--
commit 3514b0c5edd38e0cdd6bf2d3e8b3ba10d7e617d2
Author: SJ Park <sj@kernel.org>
mm/damon/tests/core-kunit: test damon_rand()
This commit introduces a kunit test for the damon_rand() PRNG to ensure that
the generated output respects the expected bounds.
> diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
> index a00168730445d..0ec7d14d354e7 100644
> --- a/mm/damon/tests/core-kunit.h
> +++ b/mm/damon/tests/core-kunit.h
[ ... ]
> +static void damon_test_rand(struct kunit *test)
> +{
> + struct damon_ctx ctx;
> + int i;
> +
> + prandom_seed_state(&ctx.rnd_state, get_random_u64());
> + for (i = 0; i < 10000; i++) {
> + unsigned long rnd = damon_rand(&ctx, 0, 10);
[Severity: Low]
Does this test miss the 64-bit fallback path in damon_rand()?
Looking at the implementation of damon_rand(), it contains specific logic for
spans exceeding U32_MAX. By hardcoding a span of 10, the test exclusively
exercises the 32-bit fast path and leaves the 64-bit arithmetic
(mul_u64_u64_shr) completely untested.
Could we add cases that test spans larger than U32_MAX?
> +
> + KUNIT_EXPECT_GE(test, rnd, 0);
[Severity: Medium]
Is this comparison inherently tautological?
Since rnd is an unsigned long, rnd >= 0 is always true, which renders this
assertion ineffective and might trigger compiler warnings for tautological
comparisons.
Additionally, because the test uses 0 for the lower bound, does it properly
verify that damon_rand() correctly applies the lower bound offset to its
output? If the implementation failed to add the lower bound, this test would
not catch it.
> + KUNIT_EXPECT_LE(test, rnd, 9);
> + }
> +}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260630141726.92246-1-sj@kernel.org?part=3
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH 03/11] mm/damon/tests/core-kunit: test damon_rand()
2026-06-30 14:25 ` sashiko-bot
@ 2026-06-30 14:54 ` SJ Park
0 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:54 UTC (permalink / raw)
To: sashiko-bot; +Cc: SJ Park, damon
On Tue, 30 Jun 2026 14:25:02 +0000 sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
> - [Medium] The lower bound check `KUNIT_EXPECT_GE(test, rnd, 0)` is a tautology and fails to test the lower bound offset logic.
> - [Low] The test completely misses the 64-bit slow path of `damon_rand()`.
> --
>
> commit 3514b0c5edd38e0cdd6bf2d3e8b3ba10d7e617d2
> Author: SJ Park <sj@kernel.org>
>
> mm/damon/tests/core-kunit: test damon_rand()
>
> This commit introduces a kunit test for the damon_rand() PRNG to ensure that
> the generated output respects the expected bounds.
>
> > diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
> > index a00168730445d..0ec7d14d354e7 100644
> > --- a/mm/damon/tests/core-kunit.h
> > +++ b/mm/damon/tests/core-kunit.h
>
> [ ... ]
>
> > +static void damon_test_rand(struct kunit *test)
> > +{
> > + struct damon_ctx ctx;
> > + int i;
> > +
> > + prandom_seed_state(&ctx.rnd_state, get_random_u64());
> > + for (i = 0; i < 10000; i++) {
> > + unsigned long rnd = damon_rand(&ctx, 0, 10);
>
> [Severity: Low]
> Does this test miss the 64-bit fallback path in damon_rand()?
>
> Looking at the implementation of damon_rand(), it contains specific logic for
> spans exceeding U32_MAX. By hardcoding a span of 10, the test exclusively
> exercises the 32-bit fast path and leaves the 64-bit arithmetic
> (mul_u64_u64_shr) completely untested.
>
> Could we add cases that test spans larger than U32_MAX?
As I previously replied, that could be a good enhancement future work. Not a
blocker for this patch, though.
>
> > +
> > + KUNIT_EXPECT_GE(test, rnd, 0);
>
> [Severity: Medium]
> Is this comparison inherently tautological?
>
> Since rnd is an unsigned long, rnd >= 0 is always true, which renders this
> assertion ineffective and might trigger compiler warnings for tautological
> comparisons.
>
> Additionally, because the test uses 0 for the lower bound, does it properly
> verify that damon_rand() correctly applies the lower bound offset to its
> output? If the implementation failed to add the lower bound, this test would
> not catch it.
Again, nice improvement candidate rather than a blocker for this patch.
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 04/11] selftests/damon/sysfs.sh: test multiple probe dirs creation
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (2 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 03/11] mm/damon/tests/core-kunit: test damon_rand() SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 05/11] selftests/damon/sysfs.sh: test {core,ops}_filters/ directories SJ Park
` (7 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton
Cc: SJ Park, Shuah Khan, damon, linux-kernel, linux-kselftest,
linux-mm
DAMON sysfs essential file operations test (sysfs.sh) was extended to
test DAMON probes sysfs directory, by commit 14885da09b0f
("selftests/damon/sysfs.sh: test probes dir"). Unlike other DAMON sysfs
files, it is testing only a single directory case. Extend it for
multiple directories.
Signed-off-by: SJ Park <sj@kernel.org>
---
tools/testing/selftests/damon/sysfs.sh | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/tools/testing/selftests/damon/sysfs.sh b/tools/testing/selftests/damon/sysfs.sh
index 2eaaa5ae3c5ed..d528dfea44c3b 100755
--- a/tools/testing/selftests/damon/sysfs.sh
+++ b/tools/testing/selftests/damon/sysfs.sh
@@ -346,8 +346,13 @@ test_probes()
ensure_write_succ "$probes_dir/nr_probes" "1" "valid input"
test_probe "$probes_dir/0"
+ ensure_write_succ "$probes_dir/nr_probes" "2" "valid input"
+ test_probe "$probes_dir/0"
+ test_probe "$probes_dir/1"
+
ensure_write_succ "$probes_dir/nr_probes" "0" "valid input"
ensure_dir "$probes_dir/0" "not_exist"
+ ensure_dir "$probes_dir/1" "not_exist"
}
test_monitoring_attrs()
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 05/11] selftests/damon/sysfs.sh: test {core,ops}_filters/ directories
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (3 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 04/11] selftests/damon/sysfs.sh: test multiple probe dirs creation SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 06/11] selftests/damon/sysfs.sh: test dests dir SJ Park
` (6 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton
Cc: SJ Park, Shuah Khan, damon, linux-kernel, linux-kselftest,
linux-mm
DAMON sysfs interface essential file operations test (sysf.sh) is not
testing DAMOS {core,ops}_filters directories. Add the tests.
Signed-off-by: SJ Park <sj@kernel.org>
---
tools/testing/selftests/damon/sysfs.sh | 28 ++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/damon/sysfs.sh b/tools/testing/selftests/damon/sysfs.sh
index d528dfea44c3b..78eea0d13c271 100755
--- a/tools/testing/selftests/damon/sysfs.sh
+++ b/tools/testing/selftests/damon/sysfs.sh
@@ -103,10 +103,28 @@ test_filter()
{
filter_dir=$1
ensure_file "$filter_dir/type" "exist" "600"
- ensure_write_succ "$filter_dir/type" "anon" "valid input"
- ensure_write_succ "$filter_dir/type" "memcg" "valid input"
- ensure_write_succ "$filter_dir/type" "addr" "valid input"
- ensure_write_succ "$filter_dir/type" "target" "valid input"
+
+ local dir_name=$(basename "$(dirname "$filter_dir")")
+ if [ "$dir_name" = "filters" ] || [ "$dir_name" = "ops_filters" ]
+ then
+ ensure_write_succ "$filter_dir/type" "anon" "valid input"
+ ensure_write_succ "$filter_dir/type" "memcg" "valid input"
+ fi
+ if [ "$dir_name" = "filters" ] || [ "$dir_name" = "core_filters" ]
+ then
+ ensure_write_succ "$filter_dir/type" "addr" "valid input"
+ ensure_write_succ "$filter_dir/type" "target" "valid input"
+ fi
+ if [ "$dir_name" = "core_filters" ]
+ then
+ ensure_write_fail "$filter_dir/type" "anon" "ops type"
+ ensure_write_fail "$filter_dir/type" "memcg" "ops type"
+ fi
+ if [ "$dir_name" = "ops_filters" ]
+ then
+ ensure_write_fail "$filter_dir/type" "addr" "core type"
+ ensure_write_fail "$filter_dir/type" "target" "core type"
+ fi
ensure_write_fail "$filter_dir/type" "foo" "invalid input"
ensure_file "$filter_dir/matching" "exist" "600"
ensure_file "$filter_dir/memcg_path" "exist" "600"
@@ -208,6 +226,8 @@ test_scheme()
test_quotas "$scheme_dir/quotas"
test_watermarks "$scheme_dir/watermarks"
test_filters "$scheme_dir/filters"
+ test_filters "$scheme_dir/core_filters"
+ test_filters "$scheme_dir/ops_filters"
test_stats "$scheme_dir/stats"
test_tried_regions "$scheme_dir/tried_regions"
}
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 06/11] selftests/damon/sysfs.sh: test dests dir
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (4 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 05/11] selftests/damon/sysfs.sh: test {core,ops}_filters/ directories SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 07/11] selftests/damon/sysfs.sh: test all files in quota goal dir SJ Park
` (5 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton
Cc: SJ Park, Shuah Khan, damon, linux-kernel, linux-kselftest,
linux-mm
DAMON selftest interface essential file operations test (sysfs.sh) is
not testing DAMOS dests/ directory. Add the test.
Signed-off-by: SJ Park <sj@kernel.org>
---
tools/testing/selftests/damon/sysfs.sh | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/tools/testing/selftests/damon/sysfs.sh b/tools/testing/selftests/damon/sysfs.sh
index 78eea0d13c271..f8d2092be004d 100755
--- a/tools/testing/selftests/damon/sysfs.sh
+++ b/tools/testing/selftests/damon/sysfs.sh
@@ -99,6 +99,29 @@ test_stats()
done
}
+test_dest()
+{
+ dest_dir=$1
+ ensure_file "$dest_dir/id" "exist" "600"
+ ensure_file "$dest_dir/weight" "exist" "600"
+}
+
+test_dests()
+{
+ dests_dir=$1
+ ensure_file "$dests_dir/nr_dests" "exist" "600"
+ ensure_write_succ "$dests_dir/nr_dests" "1" "valid input"
+ test_dest "$dests_dir/0"
+
+ ensure_write_succ "$dests_dir/nr_dests" "2" "valid input"
+ test_dest "$dests_dir/0"
+ test_dest "$dests_dir/1"
+
+ ensure_write_succ "$dests_dir/nr_dests" "0" "valid input"
+ ensure_dir "$dests_dir/0" "not_exist"
+ ensure_dir "$dests_dir/1" "not_exist"
+}
+
test_filter()
{
filter_dir=$1
@@ -225,6 +248,7 @@ test_scheme()
ensure_file "$scheme_dir/apply_interval_us" "exist" "600"
test_quotas "$scheme_dir/quotas"
test_watermarks "$scheme_dir/watermarks"
+ test_dests "$scheme_dir/dests"
test_filters "$scheme_dir/filters"
test_filters "$scheme_dir/core_filters"
test_filters "$scheme_dir/ops_filters"
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 07/11] selftests/damon/sysfs.sh: test all files in quota goal dir
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (5 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 06/11] selftests/damon/sysfs.sh: test dests dir SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 08/11] mm/damon/core: reduce range setup in damon_commit_target_regions() SJ Park
` (4 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton
Cc: SJ Park, Shuah Khan, damon, linux-kernel, linux-kselftest,
linux-mm
DAMON sysfs interface for DAMOS quota has quite extended since its
initial introduction. The test case for that in DAMON sysfs interface
essential file operations test (sysfs.sh) has not accordingly extended,
though. Extend the test case to test all existing files.
Signed-off-by: SJ Park <sj@kernel.org>
---
tools/testing/selftests/damon/sysfs.sh | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/tools/testing/selftests/damon/sysfs.sh b/tools/testing/selftests/damon/sysfs.sh
index f8d2092be004d..b43deee60fe95 100755
--- a/tools/testing/selftests/damon/sysfs.sh
+++ b/tools/testing/selftests/damon/sysfs.sh
@@ -199,6 +199,20 @@ test_goal()
ensure_dir "$goal_dir" "exist"
ensure_file "$goal_dir/target_value" "exist" "600"
ensure_file "$goal_dir/current_value" "exist" "600"
+ ensure_file "$goal_dir/target_metric" "exist" "600"
+ local fpath="$goal_dir/target_metric"
+ ensure_write_succ "$fpath" "user_input" "valid input"
+ ensure_write_succ "$fpath" "some_mem_psi_us" "valid input"
+ ensure_write_succ "$fpath" "node_mem_used_bp" "valid input"
+ ensure_write_succ "$fpath" "node_mem_free_bp" "valid input"
+ ensure_write_succ "$fpath" "node_memcg_used_bp" "valid input"
+ ensure_write_succ "$fpath" "node_memcg_free_bp" "valid input"
+ ensure_write_succ "$fpath" "active_mem_bp" "valid input"
+ ensure_write_succ "$fpath" "inactive_mem_bp" "valid input"
+ ensure_write_succ "$fpath" "node_eligible_mem_bp" "valid input"
+ ensure_write_fail "$fpath" "foo" "invalid input"
+ ensure_file "$goal_dir/nid" "exist" "600"
+ ensure_file "$goal_dir/path" "exist" "600"
}
test_goals()
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 08/11] mm/damon/core: reduce range setup in damon_commit_target_regions()
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (6 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 07/11] selftests/damon/sysfs.sh: test all files in quota goal dir SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 09/11] mm/damon/sysfs: split probe setup function out SJ Park
` (3 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton; +Cc: SJ Park, damon, linux-kernel, linux-mm
damon_commit_target_regions() calls damon_set_regions() for updating the
destination target's monitoring target region boundaries. It sets the
boundaries same to source target's monitoring regions, even if they are
adjacent. Meanwhile, damon_set_region() sets the destination target
regions exactly the same to the source, only when the target regions are
empty. When there are existing target regions, only a few regions are
expanded or shrunk to fit on only the boundaries for disjoint regions in
the source. Hence the adjacent source ranges mean nothing in common
cases. When there are many regions, such adjacent range setup is only a
waste of time and space. We recently found [1] it is actually causing
memory overhead. Setup the ranges for only distinct ranges.
[1] https://lore.kernel.org/20260603112306.58490-1-akinobu.mita@gmail.com
Signed-off-by: SJ Park <sj@kernel.org>
---
mm/damon/core.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 59a91a0ab6d45..c6fc35be633b3 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -1414,21 +1414,33 @@ static struct damon_target *damon_nth_target(int n, struct damon_ctx *ctx)
static int damon_commit_target_regions(struct damon_target *dst,
struct damon_target *src, unsigned long src_min_region_sz)
{
- struct damon_region *src_region;
+ struct damon_region *src_region, *prev = NULL;
struct damon_addr_range *ranges;
int i = 0, err;
- damon_for_each_region(src_region, src)
- i++;
+ damon_for_each_region(src_region, src) {
+ if (!prev || prev->ar.end != src_region->ar.start)
+ i++;
+ prev = src_region;
+ }
if (!i)
return 0;
ranges = kvmalloc_objs(*ranges, i, GFP_KERNEL | __GFP_NOWARN);
if (!ranges)
return -ENOMEM;
+ prev = NULL;
i = 0;
- damon_for_each_region(src_region, src)
- ranges[i++] = src_region->ar;
+ damon_for_each_region(src_region, src) {
+ if (!prev) {
+ ranges[i].start = src_region->ar.start;
+ } else if (prev->ar.end != src_region->ar.start) {
+ ranges[i++].end = prev->ar.end;
+ ranges[i].start = src_region->ar.start;
+ }
+ prev = src_region;
+ }
+ ranges[i++].end = damon_last_region(src)->ar.end;
err = damon_set_regions(dst, ranges, i, src_min_region_sz);
kvfree(ranges);
return err;
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 09/11] mm/damon/sysfs: split probe setup function out
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (7 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 08/11] mm/damon/core: reduce range setup in damon_commit_target_regions() SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 10/11] mm/damon/sysfs: split out filters setup function SJ Park
` (2 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton; +Cc: SJ Park, damon, linux-kernel, linux-mm
damon_sysfs_set_probes() function is relatively long. It has two nested
loop for setting two nested entities, namely probe and filter. Split
out the probe level setup for readability.
Signed-off-by: SJ Park <sj@kernel.org>
---
mm/damon/sysfs.c | 80 ++++++++++++++++++++++++++++--------------------
1 file changed, 46 insertions(+), 34 deletions(-)
diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index e3526a263e205..02afd37b04df4 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -1909,47 +1909,59 @@ static int damon_sysfs_set_attrs(struct damon_ctx *ctx,
return damon_set_attrs(ctx, &attrs);
}
-static int damon_sysfs_set_probes(struct damon_ctx *ctx,
- struct damon_sysfs_probes *sys_probes)
+static int damon_sysfs_set_probe(struct damon_probe *probe,
+ struct damon_sysfs_probe *sys_probe)
{
+ struct damon_sysfs_filters *sys_filters;
int i;
- for (i = 0; i < sys_probes->nr; i++) {
- struct damon_sysfs_filters *sys_filters =
- sys_probes->probes_arr[i]->filters;
- struct damon_probe *c;
- int j;
+ sys_filters = sys_probe->filters;
+ if (!sys_filters)
+ return 0;
- if (!sys_filters)
- continue;
- c = damon_new_probe();
- if (!c)
+ for (i = 0; i < sys_filters->nr; i++) {
+ struct damon_sysfs_filter *sys_filter =
+ sys_filters->filters_arr[i];
+ struct damon_filter *filter;
+
+ filter = damon_new_filter(sys_filter->type,
+ sys_filter->matching,
+ sys_filter->allow);
+ if (!filter)
return -ENOMEM;
- damon_add_probe(ctx, c);
-
- for (j = 0; j < sys_filters->nr; j++) {
- struct damon_sysfs_filter *sys_filter =
- sys_filters->filters_arr[j];
- struct damon_filter *filter;
-
- filter = damon_new_filter(sys_filter->type,
- sys_filter->matching,
- sys_filter->allow);
- if (!filter)
- return -ENOMEM;
- if (filter->type == DAMON_FILTER_TYPE_MEMCG) {
- int err;
-
- err = damon_sysfs_memcg_path_to_id(
- sys_filter->path,
- &filter->memcg_id);
- if (err) {
- damon_destroy_filter(filter);
- return err;
- }
+ if (filter->type == DAMON_FILTER_TYPE_MEMCG) {
+ int err;
+
+ err = damon_sysfs_memcg_path_to_id(
+ sys_filter->path,
+ &filter->memcg_id);
+ if (err) {
+ damon_destroy_filter(filter);
+ return err;
}
- damon_add_filter(c, filter);
}
+ damon_add_filter(probe, filter);
+ }
+ return 0;
+}
+
+static int damon_sysfs_set_probes(struct damon_ctx *ctx,
+ struct damon_sysfs_probes *sys_probes)
+{
+ int i, err;
+
+ for (i = 0; i < sys_probes->nr; i++) {
+ struct damon_sysfs_probe *sys_probe;
+ struct damon_probe *p;
+
+ p = damon_new_probe();
+ if (!p)
+ return -ENOMEM;
+ damon_add_probe(ctx, p);
+ sys_probe = sys_probes->probes_arr[i];
+ err = damon_sysfs_set_probe(p, sys_probe);
+ if (err)
+ return err;
}
return 0;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 10/11] mm/damon/sysfs: split out filters setup function
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (8 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 09/11] mm/damon/sysfs: split probe setup function out SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:17 ` [PATCH 11/11] mm/damon/sysfs: fix typos in probe_{add,rm}_dirs: s/attr/probe/ SJ Park
2026-06-30 14:57 ` [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton; +Cc: SJ Park, damon, linux-kernel, linux-mm
damon_sysfs_set_probe() is doing not only probe setup but also filters
setup. Split out filters setup for readability.
Signed-off-by: SJ Park <sj@kernel.org>
---
mm/damon/sysfs.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index 02afd37b04df4..5b2ae2fe948fa 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -1909,16 +1909,11 @@ static int damon_sysfs_set_attrs(struct damon_ctx *ctx,
return damon_set_attrs(ctx, &attrs);
}
-static int damon_sysfs_set_probe(struct damon_probe *probe,
- struct damon_sysfs_probe *sys_probe)
+static int damon_sysfs_set_filters(struct damon_probe *probe,
+ struct damon_sysfs_filters *sys_filters)
{
- struct damon_sysfs_filters *sys_filters;
int i;
- sys_filters = sys_probe->filters;
- if (!sys_filters)
- return 0;
-
for (i = 0; i < sys_filters->nr; i++) {
struct damon_sysfs_filter *sys_filter =
sys_filters->filters_arr[i];
@@ -1945,6 +1940,17 @@ static int damon_sysfs_set_probe(struct damon_probe *probe,
return 0;
}
+static int damon_sysfs_set_probe(struct damon_probe *probe,
+ struct damon_sysfs_probe *sys_probe)
+{
+ struct damon_sysfs_filters *sys_filters;
+
+ sys_filters = sys_probe->filters;
+ if (!sys_filters)
+ return 0;
+ return damon_sysfs_set_filters(probe, sys_filters);
+}
+
static int damon_sysfs_set_probes(struct damon_ctx *ctx,
struct damon_sysfs_probes *sys_probes)
{
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 11/11] mm/damon/sysfs: fix typos in probe_{add,rm}_dirs: s/attr/probe/
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (9 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 10/11] mm/damon/sysfs: split out filters setup function SJ Park
@ 2026-06-30 14:17 ` SJ Park
2026-06-30 14:57 ` [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:17 UTC (permalink / raw)
To: Andrew Morton; +Cc: SJ Park, damon, linux-kernel, linux-mm
damon_sysfs_probe_{add,rm}_dirs names a variable for damon_sysf_probe
as 'attr'. Probably a trivial copy-pasta error, but it makes the code
not pleasant to read. Fix those.
Signed-off-by: SJ Park <sj@kernel.org>
---
mm/damon/sysfs.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index 5b2ae2fe948fa..6710b6d019bf5 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -1073,7 +1073,7 @@ static struct damon_sysfs_probe *damon_sysfs_probe_alloc(void)
return kzalloc_obj(struct damon_sysfs_probe);
}
-static int damon_sysfs_probe_add_dirs(struct damon_sysfs_probe *attr)
+static int damon_sysfs_probe_add_dirs(struct damon_sysfs_probe *probe)
{
struct damon_sysfs_filters *filters;
int err;
@@ -1081,22 +1081,22 @@ static int damon_sysfs_probe_add_dirs(struct damon_sysfs_probe *attr)
filters = damon_sysfs_filters_alloc();
if (!filters)
return -ENOMEM;
- attr->filters = filters;
+ probe->filters = filters;
err = kobject_init_and_add(&filters->kobj, &damon_sysfs_filters_ktype,
- &attr->kobj, "filters");
+ &probe->kobj, "filters");
if (err) {
kobject_put(&filters->kobj);
- attr->filters = NULL;
+ probe->filters = NULL;
}
return err;
}
-static void damon_sysfs_probe_rm_dirs(struct damon_sysfs_probe *attr)
+static void damon_sysfs_probe_rm_dirs(struct damon_sysfs_probe *probe)
{
- if (attr->filters) {
- damon_sysfs_filters_rm_dirs(attr->filters);
- kobject_put(&attr->filters->kobj);
+ if (probe->filters) {
+ damon_sysfs_filters_rm_dirs(probe->filters);
+ kobject_put(&probe->filters->kobj);
}
}
--
2.47.3
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code
2026-06-30 14:17 [PATCH 00/11] mm/damon: update, optimize, and clean up doc, tests, and code SJ Park
` (10 preceding siblings ...)
2026-06-30 14:17 ` [PATCH 11/11] mm/damon/sysfs: fix typos in probe_{add,rm}_dirs: s/attr/probe/ SJ Park
@ 2026-06-30 14:57 ` SJ Park
11 siblings, 0 replies; 15+ messages in thread
From: SJ Park @ 2026-06-30 14:57 UTC (permalink / raw)
To: SJ Park
Cc: Andrew Morton, Liam R. Howlett, Brendan Higgins, David Gow,
David Hildenbrand, Jonathan Corbet, Lorenzo Stoakes, Michal Hocko,
Mike Rapoport, Shuah Khan, Shuah Khan, Suren Baghdasaryan,
Vlastimil Babka, damon, kunit-dev, linux-doc, linux-kernel,
linux-kselftest, linux-mm
On Tue, 30 Jun 2026 07:17:14 -0700 SJ Park <sj@kernel.org> wrote:
> Patches 1 and 2 update the design and ABI documents for recently added
> DAMON features. Patches 3-7 add or update more unit and self tests for
> DAMON to cover recently changed or added functions and sysfs files.
> Patch 8 optimizes damon_commit_target_regions() to skip unnecessary
> adjacent ranges setup. Patches 9-11 clean and fix up recently added
> DAMON sysfs interface code for readability.
Sashiko found a few things that could be good future works, but none of those
is a blocker of this series, in my opinion. Please read the full thread [1] in
lore.kernel.org if you want more details of Sashiko findings and my replies.
[1] https://lore.kernel.org/20260630141726.92246-1-sj@kernel.org
THanks,
SJ
[...]
^ permalink raw reply [flat|nested] 15+ messages in thread