* [RFC PATCH v5 01/10] mm/damon/core: introduce damon_ctx->paused
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-24 1:28 ` (sashiko review) " SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 02/10] mm/damon/sysfs: add pause file under context dir SeongJae Park
` (9 subsequent siblings)
10 siblings, 1 reply; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Andrew Morton, damon, linux-kernel, linux-mm
DAMON supports only start and stop of the execution. When it is
stopped, its internal data that it self-trained goes away. It will be
useful if the execution can be paused and resumed with the previous
self-trained data.
Introduce per-context API parameter, 'paused', for the purpose. The
parameter can be set and unset while DAMON is running and paused, using
the online parameters commit helper functions (damon_commit_ctx() and
damon_call()). Once 'paused' is set, the kdamond_fn() main loop does
only limited works with sampling interval sleep during the works. The
limited works include the handling of the online parameters update, so
that users can unset the 'pause' and resume the execution when they
want. It also keep checking DAMON stop conditions and handling of it,
so that DAMON can be stopped while paused if needed.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
include/linux/damon.h | 2 ++
mm/damon/core.c | 9 +++++++++
2 files changed, 11 insertions(+)
diff --git a/include/linux/damon.h b/include/linux/damon.h
index 04c8a052fcfbe..65c8d5ef510fe 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -787,6 +787,7 @@ struct damon_attrs {
* @ops: Set of monitoring operations for given use cases.
* @addr_unit: Scale factor for core to ops address conversion.
* @min_region_sz: Minimum region size.
+ * @pause: Pause kdamond main loop.
* @adaptive_targets: Head of monitoring targets (&damon_target) list.
* @schemes: Head of schemes (&damos) list.
*/
@@ -838,6 +839,7 @@ struct damon_ctx {
struct damon_operations ops;
unsigned long addr_unit;
unsigned long min_region_sz;
+ bool pause;
struct list_head adaptive_targets;
struct list_head schemes;
diff --git a/mm/damon/core.c b/mm/damon/core.c
index db6c67e52d2b8..0ab2cfa848e69 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -1349,6 +1349,7 @@ int damon_commit_ctx(struct damon_ctx *dst, struct damon_ctx *src)
if (err)
return err;
}
+ dst->pause = src->pause;
dst->ops = src->ops;
dst->addr_unit = src->addr_unit;
dst->min_region_sz = src->min_region_sz;
@@ -3003,6 +3004,14 @@ static int kdamond_fn(void *data)
kdamond_call(ctx, false);
if (ctx->maybe_corrupted)
break;
+ while (ctx->pause) {
+ damos_walk_cancel(ctx);
+ kdamond_usleep(ctx->attrs.sample_interval);
+ /* allow caller unset pause via damon_call() */
+ kdamond_call(ctx, false);
+ if (kdamond_need_stop(ctx) || ctx->maybe_corrupted)
+ goto done;
+ }
if (!list_empty(&ctx->schemes))
kdamond_apply_schemes(ctx);
else
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: (sashiko review) [RFC PATCH v5 01/10] mm/damon/core: introduce damon_ctx->paused
2026-03-23 23:15 ` [RFC PATCH v5 01/10] mm/damon/core: introduce damon_ctx->paused SeongJae Park
@ 2026-03-24 1:28 ` SeongJae Park
2026-03-24 4:07 ` SeongJae Park
0 siblings, 1 reply; 16+ messages in thread
From: SeongJae Park @ 2026-03-24 1:28 UTC (permalink / raw)
To: SeongJae Park; +Cc: Andrew Morton, damon, linux-kernel, linux-mm
Forwarding Sashiko review for doing discussions via mails.
# review url: https://sashiko.dev/#/patchset/20260323231538.84452-2-sj@kernel.org
# start of sashiko.dev inline review
commit 011f7b451b6e4a657677ee09eada15a7980e8480
Author: SeongJae Park <sj@kernel.org>
mm/damon/core: introduce damon_ctx->paused
This commit introduces a pause parameter to the DAMON context, allowing
the kdamond main loop to be paused and resumed without losing its
self-trained internal data.
> diff --git a/mm/damon/core.c b/mm/damon/core.c
> index db6c67e52d2b..0ab2cfa848e6 100644
> --- a/mm/damon/core.c
> +++ b/mm/damon/core.c
[ ... ]
> @@ -3003,6 +3004,14 @@ static int kdamond_fn(void *data)
> kdamond_call(ctx, false);
> if (ctx->maybe_corrupted)
> break;
> + while (ctx->pause) {
> + damos_walk_cancel(ctx);
> + kdamond_usleep(ctx->attrs.sample_interval);
> + /* allow caller unset pause via damon_call() */
> + kdamond_call(ctx, false);
> + if (kdamond_need_stop(ctx) || ctx->maybe_corrupted)
> + goto done;
> + }
Since this loop is located after ops.prepare_access_checks(), kdamond_usleep(),
and ops.check_accesses(), does this unconditionally perform a full monitoring
cycle before honoring the paused state?
If a context is started with pause set to true, or if pause is enabled while
waiting in kdamond_wait_activation(), it appears it will still execute one
complete active sampling cycle. Could this cause unexpected disruption, such
as clearing PTE accessed bits, when the context is explicitly configured to
be paused?
Additionally, when the context is paused, kdamond_fn remains in this sleep
loop and skips calling damos_adjust_quota(), which means quota->charged_from
is frozen.
If the pause lasts for more than LONG_MAX jiffies (e.g., about 24.8 days on
a 32-bit system with HZ=1000), will system jiffies wrap past the half-range
limit of the unsigned long type relative to the frozen timestamp?
If this wraparound occurs, time_after_eq(jiffies, quota->charged_from +
interval) would evaluate to false when unpaused. Would this cause the quota
window to not reset for another 24.8 days, accumulating charged_sz and
blocking the scheme from being applied?
# end of sashiko.dev inline review
# review url: https://sashiko.dev/#/patchset/20260323231538.84452-2-sj@kernel.org
#
# hkml [1] generated a draft of this mail. It can be regenerated
# using below command:
#
# hkml patch sashiko_dev --for_forwarding \
# 20260323231538.84452-2-sj@kernel.org
#
# [1] https://github.com/sjp38/hackermail
Sent using hkml (https://github.com/sjp38/hackermail)
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: (sashiko review) [RFC PATCH v5 01/10] mm/damon/core: introduce damon_ctx->paused
2026-03-24 1:28 ` (sashiko review) " SeongJae Park
@ 2026-03-24 4:07 ` SeongJae Park
0 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-24 4:07 UTC (permalink / raw)
To: SeongJae Park; +Cc: Andrew Morton, damon, linux-kernel, linux-mm
On Mon, 23 Mar 2026 18:28:00 -0700 SeongJae Park <sj@kernel.org> wrote:
> Forwarding Sashiko review for doing discussions via mails.
>
> # review url: https://sashiko.dev/#/patchset/20260323231538.84452-2-sj@kernel.org
> # start of sashiko.dev inline review
> commit 011f7b451b6e4a657677ee09eada15a7980e8480
> Author: SeongJae Park <sj@kernel.org>
>
> mm/damon/core: introduce damon_ctx->paused
>
> This commit introduces a pause parameter to the DAMON context, allowing
> the kdamond main loop to be paused and resumed without losing its
> self-trained internal data.
>
> > diff --git a/mm/damon/core.c b/mm/damon/core.c
> > index db6c67e52d2b..0ab2cfa848e6 100644
> > --- a/mm/damon/core.c
> > +++ b/mm/damon/core.c
> [ ... ]
> > @@ -3003,6 +3004,14 @@ static int kdamond_fn(void *data)
> > kdamond_call(ctx, false);
> > if (ctx->maybe_corrupted)
> > break;
> > + while (ctx->pause) {
> > + damos_walk_cancel(ctx);
> > + kdamond_usleep(ctx->attrs.sample_interval);
> > + /* allow caller unset pause via damon_call() */
> > + kdamond_call(ctx, false);
> > + if (kdamond_need_stop(ctx) || ctx->maybe_corrupted)
> > + goto done;
> > + }
>
> Since this loop is located after ops.prepare_access_checks(), kdamond_usleep(),
> and ops.check_accesses(), does this unconditionally perform a full monitoring
> cycle before honoring the paused state?
>
> If a context is started with pause set to true, or if pause is enabled while
> waiting in kdamond_wait_activation(), it appears it will still execute one
> complete active sampling cycle. Could this cause unexpected disruption, such
> as clearing PTE accessed bits, when the context is explicitly configured to
> be paused?
Yes, DAMON would behave in the way. And having one more sampling work doesn't
cause a real issue.
>
> Additionally, when the context is paused, kdamond_fn remains in this sleep
> loop and skips calling damos_adjust_quota(), which means quota->charged_from
> is frozen.
>
> If the pause lasts for more than LONG_MAX jiffies (e.g., about 24.8 days on
> a 32-bit system with HZ=1000), will system jiffies wrap past the half-range
> limit of the unsigned long type relative to the frozen timestamp?
>
> If this wraparound occurs, time_after_eq(jiffies, quota->charged_from +
> interval) would evaluate to false when unpaused. Would this cause the quota
> window to not reset for another 24.8 days, accumulating charged_sz and
> blocking the scheme from being applied?
That's a wild corner case, but I agree it is better to avoid the problematic
case. I'm still thinking about the good way for that. Anyway, I will address
this in the next spin.
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 16+ messages in thread
* [RFC PATCH v5 02/10] mm/damon/sysfs: add pause file under context dir
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 01/10] mm/damon/core: introduce damon_ctx->paused SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 03/10] Docs/mm/damon/design: update for context pause/resume feature SeongJae Park
` (8 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Andrew Morton, damon, linux-kernel, linux-mm
Add pause DAMON sysfs file under the context directory. It exposes the
damon_ctx->pause API parameter to the users so that they can use the
pause/resume feature.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
mm/damon/sysfs.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index 6a44a2f3d8fc9..51893abd09472 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -866,6 +866,7 @@ struct damon_sysfs_context {
struct damon_sysfs_attrs *attrs;
struct damon_sysfs_targets *targets;
struct damon_sysfs_schemes *schemes;
+ bool pause;
};
static struct damon_sysfs_context *damon_sysfs_context_alloc(
@@ -878,6 +879,7 @@ static struct damon_sysfs_context *damon_sysfs_context_alloc(
context->kobj = (struct kobject){};
context->ops_id = ops_id;
context->addr_unit = 1;
+ context->pause = false;
return context;
}
@@ -1053,6 +1055,30 @@ static ssize_t addr_unit_store(struct kobject *kobj,
return count;
}
+static ssize_t pause_show(struct kobject *kobj, struct kobj_attribute *attr,
+ char *buf)
+{
+ struct damon_sysfs_context *context = container_of(kobj,
+ struct damon_sysfs_context, kobj);
+
+ return sysfs_emit(buf, "%c\n", context->pause ? 'Y' : 'N');
+}
+
+static ssize_t pause_store(struct kobject *kobj, struct kobj_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct damon_sysfs_context *context = container_of(kobj,
+ struct damon_sysfs_context, kobj);
+ bool pause;
+ int err = kstrtobool(buf, &pause);
+
+ if (err)
+ return err;
+ context->pause = pause;
+ return count;
+}
+
+
static void damon_sysfs_context_release(struct kobject *kobj)
{
kfree(container_of(kobj, struct damon_sysfs_context, kobj));
@@ -1067,10 +1093,14 @@ static struct kobj_attribute damon_sysfs_context_operations_attr =
static struct kobj_attribute damon_sysfs_context_addr_unit_attr =
__ATTR_RW_MODE(addr_unit, 0600);
+static struct kobj_attribute damon_sysfs_context_pause_attr =
+ __ATTR_RW_MODE(pause, 0600);
+
static struct attribute *damon_sysfs_context_attrs[] = {
&damon_sysfs_context_avail_operations_attr.attr,
&damon_sysfs_context_operations_attr.attr,
&damon_sysfs_context_addr_unit_attr.attr,
+ &damon_sysfs_context_pause_attr.attr,
NULL,
};
ATTRIBUTE_GROUPS(damon_sysfs_context);
@@ -1470,6 +1500,7 @@ static int damon_sysfs_apply_inputs(struct damon_ctx *ctx,
if (sys_ctx->ops_id == DAMON_OPS_PADDR)
ctx->min_region_sz = max(
DAMON_MIN_REGION_SZ / sys_ctx->addr_unit, 1);
+ ctx->pause = sys_ctx->pause;
err = damon_sysfs_set_attrs(ctx, sys_ctx->attrs);
if (err)
return err;
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [RFC PATCH v5 03/10] Docs/mm/damon/design: update for context pause/resume feature
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 01/10] mm/damon/core: introduce damon_ctx->paused SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 02/10] mm/damon/sysfs: add pause file under context dir SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 04/10] Docs/admin-guide/mm/damon/usage: update for pause file SeongJae Park
` (7 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Liam R. Howlett, Andrew Morton, David Hildenbrand,
Jonathan Corbet, Lorenzo Stoakes, Michal Hocko, Mike Rapoport,
Shuah Khan, Suren Baghdasaryan, Vlastimil Babka, damon, linux-doc,
linux-kernel, linux-mm
Update DAMON design document for the context execution pause/resume
feature.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
Documentation/mm/damon/design.rst | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/design.rst
index afc7d52bda2f7..510ec6375178d 100644
--- a/Documentation/mm/damon/design.rst
+++ b/Documentation/mm/damon/design.rst
@@ -19,6 +19,13 @@ types of monitoring.
To know how user-space can do the configurations and start/stop DAMON, refer to
:ref:`DAMON sysfs interface <sysfs_interface>` documentation.
+Users can also request each context execution to be paused and resumed. When
+it is paused, the kdamond does nothing other than applying online parameter
+update.
+
+To know how user-space can pause/resume each context, refer to :ref:`DAMON
+sysfs context <sysfs_context>` usage documentation.
+
Overall Architecture
====================
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [RFC PATCH v5 04/10] Docs/admin-guide/mm/damon/usage: update for pause file
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (2 preceding siblings ...)
2026-03-23 23:15 ` [RFC PATCH v5 03/10] Docs/mm/damon/design: update for context pause/resume feature SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 05/10] Docs/ABI/damon: update for pause sysfs file SeongJae Park
` (6 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Liam R. Howlett, Andrew Morton, David Hildenbrand,
Jonathan Corbet, Lorenzo Stoakes, Michal Hocko, Mike Rapoport,
Shuah Khan, Suren Baghdasaryan, Vlastimil Babka, damon, linux-doc,
linux-kernel, linux-mm
Update DAMON usage document for the DAMON context execution pause/resume
feature.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
Documentation/admin-guide/mm/damon/usage.rst | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/Documentation/admin-guide/mm/damon/usage.rst b/Documentation/admin-guide/mm/damon/usage.rst
index 534e1199cf091..bfdb717441f05 100644
--- a/Documentation/admin-guide/mm/damon/usage.rst
+++ b/Documentation/admin-guide/mm/damon/usage.rst
@@ -66,7 +66,8 @@ comma (",").
│ :ref:`kdamonds <sysfs_kdamonds>`/nr_kdamonds
│ │ :ref:`0 <sysfs_kdamond>`/state,pid,refresh_ms
│ │ │ :ref:`contexts <sysfs_contexts>`/nr_contexts
- │ │ │ │ :ref:`0 <sysfs_context>`/avail_operations,operations,addr_unit
+ │ │ │ │ :ref:`0 <sysfs_context>`/avail_operations,operations,addr_unit,
+ │ │ │ │ pause
│ │ │ │ │ :ref:`monitoring_attrs <sysfs_monitoring_attrs>`/
│ │ │ │ │ │ intervals/sample_us,aggr_us,update_us
│ │ │ │ │ │ │ intervals_goal/access_bp,aggrs,min_sample_us,max_sample_us
@@ -194,9 +195,9 @@ details). At the moment, only one context per kdamond is supported, so only
contexts/<N>/
-------------
-In each context directory, three files (``avail_operations``, ``operations``
-and ``addr_unit``) and three directories (``monitoring_attrs``, ``targets``,
-and ``schemes``) exist.
+In each context directory, four files (``avail_operations``, ``operations``,
+``addr_unit`` and ``pause``) and three directories (``monitoring_attrs``,
+``targets``, and ``schemes``) exist.
DAMON supports multiple types of :ref:`monitoring operations
<damon_design_configurable_operations_set>`, including those for virtual address
@@ -214,6 +215,9 @@ reading from the ``operations`` file.
``addr_unit`` file is for setting and getting the :ref:`address unit
<damon_design_addr_unit>` parameter of the operations set.
+``pause`` file is for setting and getting the :ref:`pause request
+<damon_design_execution_model_and_data_structures>` parameter of the context.
+
.. _sysfs_monitoring_attrs:
contexts/<N>/monitoring_attrs/
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [RFC PATCH v5 05/10] Docs/ABI/damon: update for pause sysfs file
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (3 preceding siblings ...)
2026-03-23 23:15 ` [RFC PATCH v5 04/10] Docs/admin-guide/mm/damon/usage: update for pause file SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 06/10] mm/damon/tests/core-kunit: test pause commitment SeongJae Park
` (5 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, damon, linux-kernel, linux-mm
Update DAMON ABI document for the DAMON context execution pause/resume
feature.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
Documentation/ABI/testing/sysfs-kernel-mm-damon | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-kernel-mm-damon b/Documentation/ABI/testing/sysfs-kernel-mm-damon
index 2424237ebb105..7059f540940f0 100644
--- a/Documentation/ABI/testing/sysfs-kernel-mm-damon
+++ b/Documentation/ABI/testing/sysfs-kernel-mm-damon
@@ -84,6 +84,13 @@ Description: Writing an integer to this file sets the 'address unit'
parameter of the given operations set of the context. Reading
the file returns the last-written 'address unit' value.
+What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/pause
+Date: Mar 2026
+Contact: SeongJae Park <sj@kernel.org>
+Description: Writing a boolean keyword to this file sets the 'pause' request
+ parameter for the context. Reading the file returns the
+ last-written 'pause' value.
+
What: /sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/monitoring_attrs/intervals/sample_us
Date: Mar 2022
Contact: SeongJae Park <sj@kernel.org>
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [RFC PATCH v5 06/10] mm/damon/tests/core-kunit: test pause commitment
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (4 preceding siblings ...)
2026-03-23 23:15 ` [RFC PATCH v5 05/10] Docs/ABI/damon: update for pause sysfs file SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 07/10] selftests/damon/_damon_sysfs: support pause file staging SeongJae Park
` (4 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Andrew Morton, Brendan Higgins, David Gow, damon,
kunit-dev, linux-kernel, linux-kselftest, linux-mm
Add a kunit test for commitment of damon_ctx->pause parameter that can
be done using damon_commit_ctx().
Signed-off-by: SeongJae Park <sj@kernel.org>
---
mm/damon/tests/core-kunit.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
index 9e5904c2beeb2..0030f682b23b7 100644
--- a/mm/damon/tests/core-kunit.h
+++ b/mm/damon/tests/core-kunit.h
@@ -1077,6 +1077,10 @@ static void damon_test_commit_ctx(struct kunit *test)
KUNIT_EXPECT_EQ(test, damon_commit_ctx(dst, src), 0);
src->min_region_sz = 4095;
KUNIT_EXPECT_EQ(test, damon_commit_ctx(dst, src), -EINVAL);
+ src->min_region_sz = 4096;
+ src->pause = true;
+ KUNIT_EXPECT_EQ(test, damon_commit_ctx(dst, src), 0);
+ KUNIT_EXPECT_TRUE(test, dst->pause);
damon_destroy_ctx(src);
damon_destroy_ctx(dst);
}
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [RFC PATCH v5 07/10] selftests/damon/_damon_sysfs: support pause file staging
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (5 preceding siblings ...)
2026-03-23 23:15 ` [RFC PATCH v5 06/10] mm/damon/tests/core-kunit: test pause commitment SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-24 1:28 ` (sashiko review) " SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 08/10] selftests/damon/drgn_dump_damon_status: dump pause SeongJae Park
` (3 subsequent siblings)
10 siblings, 1 reply; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Shuah Khan, damon, linux-kernel, linux-kselftest,
linux-mm
DAMON test-purpose sysfs interface control Python module, _damon_sysfs,
is not supporting the newly added pause file. Add the support of the
file, for future test and use of the feature.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
tools/testing/selftests/damon/_damon_sysfs.py | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/selftests/damon/_damon_sysfs.py
index 2b4df655d9fd0..120b96ecbd741 100644
--- a/tools/testing/selftests/damon/_damon_sysfs.py
+++ b/tools/testing/selftests/damon/_damon_sysfs.py
@@ -604,10 +604,11 @@ class DamonCtx:
targets = None
schemes = None
kdamond = None
+ pause = None
idx = None
def __init__(self, ops='paddr', monitoring_attrs=DamonAttrs(), targets=[],
- schemes=[]):
+ schemes=[], pause=False):
self.ops = ops
self.monitoring_attrs = monitoring_attrs
self.monitoring_attrs.context = self
@@ -622,6 +623,8 @@ class DamonCtx:
scheme.idx = idx
scheme.context = self
+ self.pause=pause
+
def sysfs_dir(self):
return os.path.join(self.kdamond.sysfs_dir(), 'contexts',
'%d' % self.idx)
@@ -662,6 +665,11 @@ class DamonCtx:
err = scheme.stage()
if err is not None:
return err
+
+ err = write_file(os.path.join(self.sysfs_dir(), 'pause'), self.pause)
+ if err is not None:
+ return err
+
return None
class Kdamond:
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: (sashiko review) [RFC PATCH v5 07/10] selftests/damon/_damon_sysfs: support pause file staging
2026-03-23 23:15 ` [RFC PATCH v5 07/10] selftests/damon/_damon_sysfs: support pause file staging SeongJae Park
@ 2026-03-24 1:28 ` SeongJae Park
2026-03-24 4:08 ` SeongJae Park
0 siblings, 1 reply; 16+ messages in thread
From: SeongJae Park @ 2026-03-24 1:28 UTC (permalink / raw)
To: SeongJae Park; +Cc: Shuah Khan, damon, linux-kernel, linux-kselftest, linux-mm
Forwarding Sashiko review for doing discussions via mails.
# review url: https://sashiko.dev/#/patchset/20260323231538.84452-8-sj@kernel.org
# start of sashiko.dev inline review
commit d9ca6c4a33fc4d613982730edda6f4b67ae30a67
Author: SeongJae Park <sj@kernel.org>
selftests/damon/_damon_sysfs: support pause file staging
This commit adds support for the newly added pause file to the DAMON
test-purpose sysfs interface control Python module.
> diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/selftests/damon/_damon_sysfs.py
> --- a/tools/testing/selftests/damon/_damon_sysfs.py
> +++ b/tools/testing/selftests/damon/_damon_sysfs.py
[ ... ]
> class DamonCtx:
> targets = None
> schemes = None
> kdamond = None
> + pause = None
> idx = None
>
> def __init__(self, ops='paddr', monitoring_attrs=DamonAttrs(), targets=[],
> - schemes=[]):
> + schemes=[], pause=False):
This isn't a bug introduced by this patch, but since the function signature
is being modified here, is it a good time to address the mutable default
arguments?
In Python, default arguments are evaluated exactly once at function
definition time. This means any instances of DamonCtx created without
explicitly providing targets, schemes, or monitoring_attrs will share
the same list structures and DamonAttrs instance in memory.
For example, self.monitoring_attrs.context = self overwrites the context
attribute of the shared DamonAttrs object for all default contexts.
Would it be better to change these defaults to None and instantiate them
within the method body to avoid unexpected state sharing across instances?
> self.ops = ops
> self.monitoring_attrs = monitoring_attrs
> self.monitoring_attrs.context = self
# end of sashiko.dev inline review
# review url: https://sashiko.dev/#/patchset/20260323231538.84452-8-sj@kernel.org
#
# hkml [1] generated a draft of this mail. It can be regenerated
# using below command:
#
# hkml patch sashiko_dev --for_forwarding \
# 20260323231538.84452-8-sj@kernel.org
#
# [1] https://github.com/sjp38/hackermail
Sent using hkml (https://github.com/sjp38/hackermail)
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: (sashiko review) [RFC PATCH v5 07/10] selftests/damon/_damon_sysfs: support pause file staging
2026-03-24 1:28 ` (sashiko review) " SeongJae Park
@ 2026-03-24 4:08 ` SeongJae Park
0 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-24 4:08 UTC (permalink / raw)
To: SeongJae Park; +Cc: Shuah Khan, damon, linux-kernel, linux-kselftest, linux-mm
On Mon, 23 Mar 2026 18:28:24 -0700 SeongJae Park <sj@kernel.org> wrote:
> Forwarding Sashiko review for doing discussions via mails.
>
> # review url: https://sashiko.dev/#/patchset/20260323231538.84452-8-sj@kernel.org
> # start of sashiko.dev inline review
> commit d9ca6c4a33fc4d613982730edda6f4b67ae30a67
> Author: SeongJae Park <sj@kernel.org>
> selftests/damon/_damon_sysfs: support pause file staging
>
> This commit adds support for the newly added pause file to the DAMON
> test-purpose sysfs interface control Python module.
>
> > diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/selftests/damon/_damon_sysfs.py
> > --- a/tools/testing/selftests/damon/_damon_sysfs.py
> > +++ b/tools/testing/selftests/damon/_damon_sysfs.py
> [ ... ]
> > class DamonCtx:
> > targets = None
> > schemes = None
> > kdamond = None
> > + pause = None
> > idx = None
> >
> > def __init__(self, ops='paddr', monitoring_attrs=DamonAttrs(), targets=[],
> > - schemes=[]):
> > + schemes=[], pause=False):
>
> This isn't a bug introduced by this patch, but since the function signature
> is being modified here, is it a good time to address the mutable default
> arguments?
>
> In Python, default arguments are evaluated exactly once at function
> definition time. This means any instances of DamonCtx created without
> explicitly providing targets, schemes, or monitoring_attrs will share
> the same list structures and DamonAttrs instance in memory.
>
> For example, self.monitoring_attrs.context = self overwrites the context
> attribute of the shared DamonAttrs object for all default contexts.
>
> Would it be better to change these defaults to None and instantiate them
> within the method body to avoid unexpected state sharing across instances?
I agree changing the defaults to None is a good idea. But that would better to
be another patch, not this one.
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 16+ messages in thread
* [RFC PATCH v5 08/10] selftests/damon/drgn_dump_damon_status: dump pause
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (6 preceding siblings ...)
2026-03-23 23:15 ` [RFC PATCH v5 07/10] selftests/damon/_damon_sysfs: support pause file staging SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 09/10] selftests/damon/sysfs.py: check pause on assert_ctx_committed() SeongJae Park
` (2 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Shuah Khan, damon, linux-kernel, linux-kselftest,
linux-mm
drgn_dump_damon_status is not dumping the damon_ctx->pause parameter
value, so it cannot be tested. Dump it for future tests.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
tools/testing/selftests/damon/drgn_dump_damon_status.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/testing/selftests/damon/drgn_dump_damon_status.py b/tools/testing/selftests/damon/drgn_dump_damon_status.py
index af99b07a4f565..5b90eb8e7ef88 100755
--- a/tools/testing/selftests/damon/drgn_dump_damon_status.py
+++ b/tools/testing/selftests/damon/drgn_dump_damon_status.py
@@ -200,6 +200,7 @@ def damon_ctx_to_dict(ctx):
['attrs', attrs_to_dict],
['adaptive_targets', targets_to_list],
['schemes', schemes_to_list],
+ ['pause', bool],
])
def main():
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [RFC PATCH v5 09/10] selftests/damon/sysfs.py: check pause on assert_ctx_committed()
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (7 preceding siblings ...)
2026-03-23 23:15 ` [RFC PATCH v5 08/10] selftests/damon/drgn_dump_damon_status: dump pause SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-23 23:15 ` [RFC PATCH v5 10/10] selftests/damon/sysfs.py: pause DAMON before dumping status SeongJae Park
2026-03-24 1:27 ` (sashiko status) [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Shuah Khan, damon, linux-kernel, linux-kselftest,
linux-mm
Extend sysfs.py tests to confirm damon_ctx->pause can be set using the
pause sysfs file.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
tools/testing/selftests/damon/sysfs.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/testing/selftests/damon/sysfs.py b/tools/testing/selftests/damon/sysfs.py
index 3aa5c91548a53..e6d34ba05893f 100755
--- a/tools/testing/selftests/damon/sysfs.py
+++ b/tools/testing/selftests/damon/sysfs.py
@@ -190,6 +190,7 @@ def assert_ctx_committed(ctx, dump):
assert_monitoring_attrs_committed(ctx.monitoring_attrs, dump['attrs'])
assert_monitoring_targets_committed(ctx.targets, dump['adaptive_targets'])
assert_schemes_committed(ctx.schemes, dump['schemes'])
+ assert_true(dump['pause'] == ctx.pause, 'pause', dump)
def assert_ctxs_committed(kdamonds):
status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [RFC PATCH v5 10/10] selftests/damon/sysfs.py: pause DAMON before dumping status
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (8 preceding siblings ...)
2026-03-23 23:15 ` [RFC PATCH v5 09/10] selftests/damon/sysfs.py: check pause on assert_ctx_committed() SeongJae Park
@ 2026-03-23 23:15 ` SeongJae Park
2026-03-24 1:27 ` (sashiko status) [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-23 23:15 UTC (permalink / raw)
Cc: SeongJae Park, Shuah Khan, damon, linux-kernel, linux-kselftest,
linux-mm
The sysfs.py test commits DAMON parameters, dump the internal DAMON
state, and show if the parameters are committed as expected using the
dumped state. While the dumping is ongoing, DAMON is alive. It can
make internal changes including addition and removal of regions. It can
therefore make a race that can result in false test results. Pause
DAMON execution during the state dumping to avoid such races.
Signed-off-by: SeongJae Park <sj@kernel.org>
---
tools/testing/selftests/damon/sysfs.py | 38 ++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/tools/testing/selftests/damon/sysfs.py b/tools/testing/selftests/damon/sysfs.py
index e6d34ba05893f..b8d6e0f8fd906 100755
--- a/tools/testing/selftests/damon/sysfs.py
+++ b/tools/testing/selftests/damon/sysfs.py
@@ -193,18 +193,55 @@ def assert_ctx_committed(ctx, dump):
assert_true(dump['pause'] == ctx.pause, 'pause', dump)
def assert_ctxs_committed(kdamonds):
+ ctxs_paused_for_dump = []
+ kdamonds_paused_for_dump = []
+ # pause for safe state dumping
+ for kd in kdamonds.kdamonds:
+ for ctx in kd.contexts:
+ if ctx.pause is False:
+ ctx.pause = True
+ ctxs_paused_for_dump.append(ctx)
+ if not kd in kdamonds_paused_for_dump:
+ kdamonds_paused_for_dump.append(kd)
+ if kd in kdamonds_paused_for_dump:
+ err = kd.commit()
+ if err is not None:
+ print('pause fail (%s)' % err)
+ kdamonds.stop()
+ exit(1)
+
status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
if err is not None:
print(err)
kdamonds.stop()
exit(1)
+ # resume contexts paused for safe state dumping
+ for ctx in ctxs_paused_for_dump:
+ ctx.pause = False
+ for kd in kdamonds_paused_for_dump:
+ err = kd.commit()
+ if err is not None:
+ print('resume fail (%s)' % err)
+ kdamonds.stop()
+ exit(1)
+
+ # restore for comparison
+ for ctx in ctxs_paused_for_dump:
+ ctx.pause = True
+
ctxs = kdamonds.kdamonds[0].contexts
dump = status['contexts']
assert_true(len(ctxs) == len(dump), 'ctxs length', dump)
for idx, ctx in enumerate(ctxs):
assert_ctx_committed(ctx, dump[idx])
+ # restore for the caller
+ for kd in kdamonds.kdamonds:
+ for ctx in kd.contexts:
+ if ctx in ctxs_paused_for_dump:
+ ctx.pause = False
+
def main():
kdamonds = _damon_sysfs.Kdamonds(
[_damon_sysfs.Kdamond(
@@ -302,6 +339,7 @@ def main():
print('kdamond start failed: %s' % err)
exit(1)
kdamonds.kdamonds[0].contexts[0].targets[1].obsolete = True
+ kdamonds.kdamonds[0].contexts[0].pause = True
kdamonds.kdamonds[0].commit()
del kdamonds.kdamonds[0].contexts[0].targets[1]
assert_ctxs_committed(kdamonds)
--
2.47.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: (sashiko status) [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed
2026-03-23 23:15 [RFC PATCH v5 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (9 preceding siblings ...)
2026-03-23 23:15 ` [RFC PATCH v5 10/10] selftests/damon/sysfs.py: pause DAMON before dumping status SeongJae Park
@ 2026-03-24 1:27 ` SeongJae Park
10 siblings, 0 replies; 16+ messages in thread
From: SeongJae Park @ 2026-03-24 1:27 UTC (permalink / raw)
To: SeongJae Park
Cc: Liam R. Howlett, Andrew Morton, 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
Forwarding sashiko.dev review status for this thread.
# review url: https://sashiko.dev/#/patchset/20260323231538.84452-1-sj@kernel.org
- [RFC PATCH v5 01/10] mm/damon/core: introduce damon_ctx->paused
- status: Reviewed
- review: ISSUES MAY FOUND
- [RFC PATCH v5 02/10] mm/damon/sysfs: add pause file under context dir
- status: Reviewed
- review: No issues found.
- [RFC PATCH v5 03/10] Docs/mm/damon/design: update for context pause/resume feature
- status: Reviewed
- review: No issues found.
- [RFC PATCH v5 04/10] Docs/admin-guide/mm/damon/usage: update for pause file
- status: Reviewed
- review: No issues found.
- [RFC PATCH v5 05/10] Docs/ABI/damon: update for pause sysfs file
- status: Reviewed
- review: No issues found.
- [RFC PATCH v5 06/10] mm/damon/tests/core-kunit: test pause commitment
- status: Reviewed
- review: No issues found.
- [RFC PATCH v5 07/10] selftests/damon/_damon_sysfs: support pause file staging
- status: Reviewed
- review: ISSUES MAY FOUND
- [RFC PATCH v5 08/10] selftests/damon/drgn_dump_damon_status: dump pause
- status: Reviewed
- review: No issues found.
- [RFC PATCH v5 09/10] selftests/damon/sysfs.py: check pause on assert_ctx_committed()
- status: Reviewed
- review: No issues found.
- [RFC PATCH v5 10/10] selftests/damon/sysfs.py: pause DAMON before dumping status
- status: Reviewed
- review: No issues found.
# hkml [1] generated a draft of this mail. It can be regenerated
# using below command:
#
# hkml patch sashiko_dev --thread_status --for_forwarding \
# 20260323231538.84452-1-sj@kernel.org
#
# [1] https://github.com/sjp38/hackermail
Sent using hkml (https://github.com/sjp38/hackermail)
^ permalink raw reply [flat|nested] 16+ messages in thread