* [RFC PATCH v2 01/10] mm/damon/core: introduce damon_ctx->paused
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-19 6:29 ` SeongJae Park
2026-03-20 15:11 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 02/10] mm/damon/sysfs: add pause file under context dir SeongJae Park
` (8 subsequent siblings)
9 siblings, 2 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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 3a441fbca170d..421e51eff3bd2 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -811,6 +811,8 @@ struct damon_ctx {
* intervals tuning
*/
unsigned long next_intervals_tune_sis;
+ /* pause kdamond main loop */
+ bool pause;
/* for waiting until the execution of the kdamond_fn is started */
struct completion kdamond_started;
/* for scheme quotas prioritization */
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 339325e1096bc..0b6cb63d64d0e 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -1331,6 +1331,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;
@@ -2978,6 +2979,14 @@ static int kdamond_fn(void *data)
* kdamond_merge_regions() if possible, to reduce overhead
*/
kdamond_call(ctx, false);
+ while (ctx->pause) {
+ if (kdamond_need_stop(ctx))
+ goto done;
+ kdamond_usleep(ctx->attrs.sample_interval);
+ /* allow caller unset pause via damon_call() */
+ kdamond_call(ctx, false);
+ damos_walk_cancel(ctx);
+ }
if (!list_empty(&ctx->schemes))
kdamond_apply_schemes(ctx);
else
--
2.47.3
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [RFC PATCH v2 01/10] mm/damon/core: introduce damon_ctx->paused
2026-03-19 5:21 ` [RFC PATCH v2 01/10] mm/damon/core: introduce damon_ctx->paused SeongJae Park
@ 2026-03-19 6:29 ` SeongJae Park
2026-03-20 15:11 ` SeongJae Park
1 sibling, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 6:29 UTC (permalink / raw)
To: SeongJae Park; +Cc: Andrew Morton, damon, linux-kernel, linux-mm
On Wed, 18 Mar 2026 22:21:44 -0700 SeongJae Park <sj@kernel.org> wrote:
> 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 3a441fbca170d..421e51eff3bd2 100644
> --- a/include/linux/damon.h
> +++ b/include/linux/damon.h
> @@ -811,6 +811,8 @@ struct damon_ctx {
> * intervals tuning
> */
> unsigned long next_intervals_tune_sis;
> + /* pause kdamond main loop */
> + bool pause;
This field will be directly set by an API caller. But this diff is defining
this field in the private fields section. I will change this to be defined in
the public fields section, and add the kernel-doc comment, in the next version.
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [RFC PATCH v2 01/10] mm/damon/core: introduce damon_ctx->paused
2026-03-19 5:21 ` [RFC PATCH v2 01/10] mm/damon/core: introduce damon_ctx->paused SeongJae Park
2026-03-19 6:29 ` SeongJae Park
@ 2026-03-20 15:11 ` SeongJae Park
1 sibling, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-20 15:11 UTC (permalink / raw)
To: SeongJae Park; +Cc: Andrew Morton, damon, linux-kernel, linux-mm
On Wed, 18 Mar 2026 22:21:44 -0700 SeongJae Park <sj@kernel.org> wrote:
> 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 3a441fbca170d..421e51eff3bd2 100644
> --- a/include/linux/damon.h
> +++ b/include/linux/damon.h
> @@ -811,6 +811,8 @@ struct damon_ctx {
> * intervals tuning
> */
> unsigned long next_intervals_tune_sis;
> + /* pause kdamond main loop */
> + bool pause;
> /* for waiting until the execution of the kdamond_fn is started */
> struct completion kdamond_started;
> /* for scheme quotas prioritization */
> diff --git a/mm/damon/core.c b/mm/damon/core.c
> index 339325e1096bc..0b6cb63d64d0e 100644
> --- a/mm/damon/core.c
> +++ b/mm/damon/core.c
> @@ -1331,6 +1331,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;
> @@ -2978,6 +2979,14 @@ static int kdamond_fn(void *data)
> * kdamond_merge_regions() if possible, to reduce overhead
> */
> kdamond_call(ctx, false);
> + while (ctx->pause) {
> + if (kdamond_need_stop(ctx))
> + goto done;
> + kdamond_usleep(ctx->attrs.sample_interval);
> + /* allow caller unset pause via damon_call() */
> + kdamond_call(ctx, false);
> + damos_walk_cancel(ctx);
Sashiko comment
(https://sashiko.dev/#/patchset/20260319052157.99433-2-sj@kernel.org) and my
reply below.
: Can this cause spurious cancellations of DAMOS walk requests if the context
: is unpaused?
:
: If kdamond_call() processes a commit that sets ctx->pause = false, and a new
: walk request is queued concurrently or immediately after, this unconditional
: call to damos_walk_cancel() will cancel the newly submitted request before
: the loop condition is evaluated again to exit the loop.
:
: Would it be safer to verify if the context is still paused before cancelling,
: perhaps by checking if (ctx->pause) before calling damos_walk_cancel()?
Yes, it can cause unnecessary cancel of damos_walk() request. But cancelling a
few more damos_walk() request is no big deal. The caller and user can show it
is cancelled, and just ask it again.
So, not a problem.
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [RFC PATCH v2 02/10] mm/damon/sysfs: add pause file under context dir
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 01/10] mm/damon/core: introduce damon_ctx->paused SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 03/10] Docs/mm/damon/design: update for context pause/resume feature SeongJae Park
` (7 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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 576d1ddd736bf..7bd42dd8c4a73 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] 18+ messages in thread* [RFC PATCH v2 03/10] Docs/mm/damon/design: update for context pause/resume feature
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 01/10] mm/damon/core: introduce damon_ctx->paused SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 02/10] mm/damon/sysfs: add pause file under context dir SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-20 15:17 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 04/10] Docs/admin-guide/mm/damon/usage: update for pause file SeongJae Park
` (6 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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 838b14d225193..e2e4fe3fb3986 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 but only online parameters updates
+including resume request handling.
+
+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] 18+ messages in thread* Re: [RFC PATCH v2 03/10] Docs/mm/damon/design: update for context pause/resume feature
2026-03-19 5:21 ` [RFC PATCH v2 03/10] Docs/mm/damon/design: update for context pause/resume feature SeongJae Park
@ 2026-03-20 15:17 ` SeongJae Park
0 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-20 15:17 UTC (permalink / raw)
To: SeongJae Park
Cc: 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
On Wed, 18 Mar 2026 22:21:46 -0700 SeongJae Park <sj@kernel.org> wrote:
> 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 838b14d225193..e2e4fe3fb3986 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 but only online parameters updates
> +including resume request handling.
Sashiko comment
(https://sashiko.dev/#/patchset/20260319052157.99433-4-sj@kernel.org) below.
: This isn't a bug, but the phrasing "does nothing but only online parameters
: updates" is a bit awkward. Could this be reworded for clarity, perhaps to
: something like "does nothing other than apply online parameter updates"?
I pretty sure Sashiko is more English fluent than I. But, shouldn't
's/apply/applying/' ? I will update the sentence to "When it is paused, the
kdamond does nothing other than applying online parameter update" in the next
revision.
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [RFC PATCH v2 04/10] Docs/admin-guide/mm/damon/usage: update for pause file
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (2 preceding siblings ...)
2026-03-19 5:21 ` [RFC PATCH v2 03/10] Docs/mm/damon/design: update for context pause/resume feature SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 05/10] Docs/ABI/damon: update for pause sysfs file SeongJae Park
` (5 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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] 18+ messages in thread* [RFC PATCH v2 05/10] Docs/ABI/damon: update for pause sysfs file
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (3 preceding siblings ...)
2026-03-19 5:21 ` [RFC PATCH v2 04/10] Docs/admin-guide/mm/damon/usage: update for pause file SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 06/10] mm/damon/tests/core-kunit: test pause commitment SeongJae Park
` (4 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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] 18+ messages in thread* [RFC PATCH v2 06/10] mm/damon/tests/core-kunit: test pause commitment
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (4 preceding siblings ...)
2026-03-19 5:21 ` [RFC PATCH v2 05/10] Docs/ABI/damon: update for pause sysfs file SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 07/10] selftests/damon/_damon_sysfs: support pause file staging SeongJae Park
` (3 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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] 18+ messages in thread* [RFC PATCH v2 07/10] selftests/damon/_damon_sysfs: support pause file staging
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (5 preceding siblings ...)
2026-03-19 5:21 ` [RFC PATCH v2 06/10] mm/damon/tests/core-kunit: test pause commitment SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-20 15:22 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 08/10] selftests/damon/drgn_dump_damon_status: dump pause SeongJae Park
` (2 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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] 18+ messages in thread* Re: [RFC PATCH v2 07/10] selftests/damon/_damon_sysfs: support pause file staging
2026-03-19 5:21 ` [RFC PATCH v2 07/10] selftests/damon/_damon_sysfs: support pause file staging SeongJae Park
@ 2026-03-20 15:22 ` SeongJae Park
0 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-20 15:22 UTC (permalink / raw)
To: SeongJae Park; +Cc: Shuah Khan, damon, linux-kernel, linux-kselftest, linux-mm
On Wed, 18 Mar 2026 22:21:50 -0700 SeongJae Park <sj@kernel.org> wrote:
> 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):
Sashiko comment
(https://sashiko.dev/#/patchset/20260319052157.99433-8-sj@kernel.org) and my
reply.
: Since this line is being modified, could the use of mutable default
: arguments for monitoring_attrs, targets, and schemes cause unintended
: state sharing between instances?
:
: In Python, default arguments are evaluated exactly once at function
: definition time. If multiple DamonCtx objects are instantiated without
: explicitly providing these parameters, they will share the exact same
: object instances in memory.
:
: When the constructor later executes self.monitoring_attrs.context = self,
: it overwrites the context reference of the shared object to point to the
: newest DamonCtx instance. If multiple contexts are staged concurrently
: relying on the default arguments, earlier contexts might inadvertently
: write their sysfs files into the directory of the last created context.
:
: Would it be better to use None for the defaults and instantiate new objects
: inside the constructor?
Good points. Orthogonal to this patch, though. Also, there is no such use
case of this class to my best knowledge. I will consider such change later,
though.
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [RFC PATCH v2 08/10] selftests/damon/drgn_dump_damon_status: dump pause
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (6 preceding siblings ...)
2026-03-19 5:21 ` [RFC PATCH v2 07/10] selftests/damon/_damon_sysfs: support pause file staging SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 09/10] selftests/damon/sysfs.py: check pause on assert_ctx_committed() SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 10/10] selftets/damon/sysfs.py: pause DAMON before dumping status SeongJae Park
9 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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] 18+ messages in thread* [RFC PATCH v2 09/10] selftests/damon/sysfs.py: check pause on assert_ctx_committed()
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (7 preceding siblings ...)
2026-03-19 5:21 ` [RFC PATCH v2 08/10] selftests/damon/drgn_dump_damon_status: dump pause SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-19 5:21 ` [RFC PATCH v2 10/10] selftets/damon/sysfs.py: pause DAMON before dumping status SeongJae Park
9 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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] 18+ messages in thread* [RFC PATCH v2 10/10] selftets/damon/sysfs.py: pause DAMON before dumping status
2026-03-19 5:21 [RFC PATCH v2 00/10] mm/damon: let DAMON be paused and resumed SeongJae Park
` (8 preceding siblings ...)
2026-03-19 5:21 ` [RFC PATCH v2 09/10] selftests/damon/sysfs.py: check pause on assert_ctx_committed() SeongJae Park
@ 2026-03-19 5:21 ` SeongJae Park
2026-03-20 15:29 ` SeongJae Park
9 siblings, 1 reply; 18+ messages in thread
From: SeongJae Park @ 2026-03-19 5:21 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 | 31 ++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/tools/testing/selftests/damon/sysfs.py b/tools/testing/selftests/damon/sysfs.py
index e6d34ba05893f..704729c7a318e 100755
--- a/tools/testing/selftests/damon/sysfs.py
+++ b/tools/testing/selftests/damon/sysfs.py
@@ -193,18 +193,48 @@ def assert_ctx_committed(ctx, dump):
assert_true(dump['pause'] == ctx.pause, 'pause', dump)
def assert_ctxs_committed(kdamonds):
+ ctxs_paused_for_dump = []
+ for kd in kdamonds.kdamonds:
+ for ctx in kd.contexts:
+ if ctx.pause is False:
+ ctx.pause = True
+ err = kd.commit()
+ if err is not None:
+ print('pause fail (%s)' % err)
+ kdamonds.stop()
+ exit(1)
+ ctxs_paused_for_dump.append(ctx)
+
status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
if err is not None:
print(err)
kdamonds.stop()
exit(1)
+ for kd in kdamonds.kdamonds:
+ for ctx in kd.contexts:
+ if ctx in ctxs_paused_for_dump:
+ ctx.pause = False
+ err = kd.commit()
+ if err is not None:
+ print('resume fail (%s)' % err)
+ kdamonds.stop()
+ exit(1)
+ # restore for comparison
+ 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 +332,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] 18+ messages in thread* Re: [RFC PATCH v2 10/10] selftets/damon/sysfs.py: pause DAMON before dumping status
2026-03-19 5:21 ` [RFC PATCH v2 10/10] selftets/damon/sysfs.py: pause DAMON before dumping status SeongJae Park
@ 2026-03-20 15:29 ` SeongJae Park
2026-03-20 15:41 ` SeongJae Park
0 siblings, 1 reply; 18+ messages in thread
From: SeongJae Park @ 2026-03-20 15:29 UTC (permalink / raw)
To: SeongJae Park; +Cc: Shuah Khan, damon, linux-kernel, linux-kselftest, linux-mm
Adding Sashiko comment
(https://lore.kernel.org/https://sashiko.dev/#/patchset/20260319052157.99433-11-sj@kernel.org)
with ': ' line prefix, and my replies in line.
On Wed, 18 Mar 2026 22:21:53 -0700 SeongJae Park <sj@kernel.org> wrote:
> 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 | 31 ++++++++++++++++++++++++++
> 1 file changed, 31 insertions(+)
>
> diff --git a/tools/testing/selftests/damon/sysfs.py b/tools/testing/selftests/damon/sysfs.py
> index e6d34ba05893f..704729c7a318e 100755
> --- a/tools/testing/selftests/damon/sysfs.py
> +++ b/tools/testing/selftests/damon/sysfs.py
> @@ -193,18 +193,48 @@ def assert_ctx_committed(ctx, dump):
> assert_true(dump['pause'] == ctx.pause, 'pause', dump)
>
> def assert_ctxs_committed(kdamonds):
> + ctxs_paused_for_dump = []
> + for kd in kdamonds.kdamonds:
> + for ctx in kd.contexts:
> + if ctx.pause is False:
> + ctx.pause = True
> + err = kd.commit()
> + if err is not None:
> + print('pause fail (%s)' % err)
> + kdamonds.stop()
> + exit(1)
> + ctxs_paused_for_dump.append(ctx)
> +
> status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
> if err is not None:
> print(err)
> kdamonds.stop()
> exit(1)
>
> + for kd in kdamonds.kdamonds:
> + for ctx in kd.contexts:
> + if ctx in ctxs_paused_for_dump:
> + ctx.pause = False
> + err = kd.commit()
> + if err is not None:
> + print('resume fail (%s)' % err)
> + kdamonds.stop()
> + exit(1)
> + # restore for comparison
> + ctx.pause = True
: If a kdamond contains multiple contexts, does this loop leave earlier contexts
: paused in the kernel?
:
: Since kd.commit() stages and commits the state of all contexts associated with
: the kdamond, when kd.commit() is called for the second context, the first
: context's local pause attribute is already back to True.
:
: This would cause kd.commit() to write to sysfs and instruct the kernel to
: pause the first context again. By the end of this loop, only the last context
: in the kdamond would remain unpaused in the kernel.
No. The pause field of the earlier context is set to False, so later
kd.commit() will commit the False 'pause' again. But this finds a good point.
There is no reason to call kd.commit() for each context. It is more efficient
to be called for each kdamond., thouth currently we support only one context
per kdamond. I will update the code so, in the next spin.
> +
> 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
: Since kd.commit() is not called after restoring the Python objects here, does
: this leave the previous contexts permanently paused in the kernel while their
: Python state reflects them as running?
No, we already unpaused the unpause-required contexts above.
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [RFC PATCH v2 10/10] selftets/damon/sysfs.py: pause DAMON before dumping status
2026-03-20 15:29 ` SeongJae Park
@ 2026-03-20 15:41 ` SeongJae Park
2026-03-21 1:02 ` SeongJae Park
0 siblings, 1 reply; 18+ messages in thread
From: SeongJae Park @ 2026-03-20 15:41 UTC (permalink / raw)
To: SeongJae Park; +Cc: Shuah Khan, damon, linux-kernel, linux-kselftest, linux-mm
On Fri, 20 Mar 2026 08:29:39 -0700 SeongJae Park <sj@kernel.org> wrote:
> Adding Sashiko comment
> (https://lore.kernel.org/https://sashiko.dev/#/patchset/20260319052157.99433-11-sj@kernel.org)
> with ': ' line prefix, and my replies in line.
>
> On Wed, 18 Mar 2026 22:21:53 -0700 SeongJae Park <sj@kernel.org> wrote:
>
> > 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 | 31 ++++++++++++++++++++++++++
> > 1 file changed, 31 insertions(+)
> >
> > diff --git a/tools/testing/selftests/damon/sysfs.py b/tools/testing/selftests/damon/sysfs.py
> > index e6d34ba05893f..704729c7a318e 100755
> > --- a/tools/testing/selftests/damon/sysfs.py
> > +++ b/tools/testing/selftests/damon/sysfs.py
> > @@ -193,18 +193,48 @@ def assert_ctx_committed(ctx, dump):
> > assert_true(dump['pause'] == ctx.pause, 'pause', dump)
> >
> > def assert_ctxs_committed(kdamonds):
> > + ctxs_paused_for_dump = []
> > + for kd in kdamonds.kdamonds:
> > + for ctx in kd.contexts:
> > + if ctx.pause is False:
> > + ctx.pause = True
> > + err = kd.commit()
> > + if err is not None:
> > + print('pause fail (%s)' % err)
> > + kdamonds.stop()
> > + exit(1)
> > + ctxs_paused_for_dump.append(ctx)
> > +
> > status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
> > if err is not None:
> > print(err)
> > kdamonds.stop()
> > exit(1)
> >
> > + for kd in kdamonds.kdamonds:
> > + for ctx in kd.contexts:
> > + if ctx in ctxs_paused_for_dump:
> > + ctx.pause = False
> > + err = kd.commit()
> > + if err is not None:
> > + print('resume fail (%s)' % err)
> > + kdamonds.stop()
> > + exit(1)
> > + # restore for comparison
> > + ctx.pause = True
>
> : If a kdamond contains multiple contexts, does this loop leave earlier contexts
> : paused in the kernel?
> :
> : Since kd.commit() stages and commits the state of all contexts associated with
> : the kdamond, when kd.commit() is called for the second context, the first
> : context's local pause attribute is already back to True.
> :
> : This would cause kd.commit() to write to sysfs and instruct the kernel to
> : pause the first context again. By the end of this loop, only the last context
> : in the kdamond would remain unpaused in the kernel.
>
> No. The pause field of the earlier context is set to False, so later
> kd.commit() will commit the False 'pause' again. But this finds a good point.
> There is no reason to call kd.commit() for each context. It is more efficient
> to be called for each kdamond., thouth currently we support only one context
> per kdamond. I will update the code so, in the next spin.
I'm wrong, Sashiko is correct. I missed the last 'ctx.pause = True' in the
loop. I will fix this together, like below:
'''
--- a/tools/testing/selftests/damon/sysfs.py
+++ b/tools/testing/selftests/damon/sysfs.py
@@ -201,16 +201,17 @@ def assert_ctx_committed(ctx, dump):
def assert_ctxs_committed(kdamonds):
ctxs_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
- err = kd.commit()
- if err is not None:
- print('pause fail (%s)' % err)
- kdamonds.stop()
- exit(1)
ctxs_paused_for_dump.append(ctx)
+ 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:
@@ -218,17 +219,19 @@ def assert_ctxs_committed(kdamonds):
kdamonds.stop()
exit(1)
+ # resume contexts paused for safe state dumping
for kd in kdamonds.kdamonds:
- for ctx in kd.contexts:
- if ctx in ctxs_paused_for_dump:
- ctx.pause = False
- err = kd.commit()
- if err is not None:
- print('resume fail (%s)' % err)
- kdamonds.stop()
- exit(1)
- # restore for comparison
- ctx.pause = True
+ for ctx in ctxs_paused_for_dump:
+ ctx.pause = False
+ 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']
'''
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [RFC PATCH v2 10/10] selftets/damon/sysfs.py: pause DAMON before dumping status
2026-03-20 15:41 ` SeongJae Park
@ 2026-03-21 1:02 ` SeongJae Park
0 siblings, 0 replies; 18+ messages in thread
From: SeongJae Park @ 2026-03-21 1:02 UTC (permalink / raw)
To: SeongJae Park; +Cc: Shuah Khan, damon, linux-kernel, linux-kselftest, linux-mm
On Fri, 20 Mar 2026 08:41:33 -0700 SeongJae Park <sj@kernel.org> wrote:
> On Fri, 20 Mar 2026 08:29:39 -0700 SeongJae Park <sj@kernel.org> wrote:
>
> > Adding Sashiko comment
> > (https://lore.kernel.org/https://sashiko.dev/#/patchset/20260319052157.99433-11-sj@kernel.org)
> > with ': ' line prefix, and my replies in line.
> >
> > On Wed, 18 Mar 2026 22:21:53 -0700 SeongJae Park <sj@kernel.org> wrote:
> >
> > > 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 | 31 ++++++++++++++++++++++++++
> > > 1 file changed, 31 insertions(+)
> > >
> > > diff --git a/tools/testing/selftests/damon/sysfs.py b/tools/testing/selftests/damon/sysfs.py
> > > index e6d34ba05893f..704729c7a318e 100755
> > > --- a/tools/testing/selftests/damon/sysfs.py
> > > +++ b/tools/testing/selftests/damon/sysfs.py
> > > @@ -193,18 +193,48 @@ def assert_ctx_committed(ctx, dump):
> > > assert_true(dump['pause'] == ctx.pause, 'pause', dump)
> > >
> > > def assert_ctxs_committed(kdamonds):
> > > + ctxs_paused_for_dump = []
> > > + for kd in kdamonds.kdamonds:
> > > + for ctx in kd.contexts:
> > > + if ctx.pause is False:
> > > + ctx.pause = True
> > > + err = kd.commit()
> > > + if err is not None:
> > > + print('pause fail (%s)' % err)
> > > + kdamonds.stop()
> > > + exit(1)
> > > + ctxs_paused_for_dump.append(ctx)
> > > +
> > > status, err = dump_damon_status_dict(kdamonds.kdamonds[0].pid)
> > > if err is not None:
> > > print(err)
> > > kdamonds.stop()
> > > exit(1)
> > >
> > > + for kd in kdamonds.kdamonds:
> > > + for ctx in kd.contexts:
> > > + if ctx in ctxs_paused_for_dump:
> > > + ctx.pause = False
> > > + err = kd.commit()
> > > + if err is not None:
> > > + print('resume fail (%s)' % err)
> > > + kdamonds.stop()
> > > + exit(1)
> > > + # restore for comparison
> > > + ctx.pause = True
> >
> > : If a kdamond contains multiple contexts, does this loop leave earlier contexts
> > : paused in the kernel?
> > :
> > : Since kd.commit() stages and commits the state of all contexts associated with
> > : the kdamond, when kd.commit() is called for the second context, the first
> > : context's local pause attribute is already back to True.
> > :
> > : This would cause kd.commit() to write to sysfs and instruct the kernel to
> > : pause the first context again. By the end of this loop, only the last context
> > : in the kdamond would remain unpaused in the kernel.
> >
> > No. The pause field of the earlier context is set to False, so later
> > kd.commit() will commit the False 'pause' again. But this finds a good point.
> > There is no reason to call kd.commit() for each context. It is more efficient
> > to be called for each kdamond., thouth currently we support only one context
> > per kdamond. I will update the code so, in the next spin.
>
> I'm wrong, Sashiko is correct. I missed the last 'ctx.pause = True' in the
> loop. I will fix this together, like below:
>
> '''
> --- a/tools/testing/selftests/damon/sysfs.py
> +++ b/tools/testing/selftests/damon/sysfs.py
> @@ -201,16 +201,17 @@ def assert_ctx_committed(ctx, dump):
>
> def assert_ctxs_committed(kdamonds):
> ctxs_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
> - err = kd.commit()
> - if err is not None:
> - print('pause fail (%s)' % err)
> - kdamonds.stop()
> - exit(1)
> ctxs_paused_for_dump.append(ctx)
> + 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:
> @@ -218,17 +219,19 @@ def assert_ctxs_committed(kdamonds):
> kdamonds.stop()
> exit(1)
>
> + # resume contexts paused for safe state dumping
> for kd in kdamonds.kdamonds:
> - for ctx in kd.contexts:
> - if ctx in ctxs_paused_for_dump:
> - ctx.pause = False
> - err = kd.commit()
> - if err is not None:
> - print('resume fail (%s)' % err)
> - kdamonds.stop()
> - exit(1)
> - # restore for comparison
> - ctx.pause = True
> + for ctx in ctxs_paused_for_dump:
> + ctx.pause = False
> + 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']
> '''
The above fixup makes the test fails, for the obsolete targets. The fixup
needs another fixup, like below. I will add that to the next spin.
'''
--- a/tools/testing/selftests/damon/sysfs.py
+++ b/tools/testing/selftests/damon/sysfs.py
@@ -200,11 +200,12 @@ def assert_ctxs_committed(kdamonds):
if ctx.pause is False:
ctx.pause = True
ctxs_paused_for_dump.append(ctx)
- err = kd.commit()
- if err is not None:
- print('pause fail (%s)' % err)
- kdamonds.stop()
- exit(1)
+ if len(ctxs_paused_for_dump) > 0:
+ 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:
@@ -216,11 +217,12 @@ def assert_ctxs_committed(kdamonds):
for kd in kdamonds.kdamonds:
for ctx in ctxs_paused_for_dump:
ctx.pause = False
- err = kd.commit()
- if err is not None:
- print('resume fail (%s)' % err)
- kdamonds.stop()
- exit(1)
+ if len(ctxs_paused_for_dump) > 0:
+ 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:
'''
Thanks,
SJ
^ permalink raw reply [flat|nested] 18+ messages in thread