Re: [RFC PATCH 04/19] mm/damon/core: commit probes

Gutierrez Asier
2026-04-27T13:21:22Z

On 4/26/2026 11:52 PM, SeongJae Park wrote:
> Update damon_commit_ctx() to commit installed data probes, too.
>
> Signed-off-by: SeongJae Park <sj@kernel.org>
> ---
> mm/damon/core.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 104 insertions(+)
>
> diff --git a/mm/damon/core.c b/mm/damon/core.c
> index 170abba8fdf2a..2ab1d6dd47da4 100644
> --- a/mm/damon/core.c
> +++ b/mm/damon/core.c
> @@ -129,11 +129,34 @@ void damon_add_filter(struct damon_probe *p, struct damon_filter *f)
> list_add_tail(&f->list, &p->filters);
> }
>
> +static void damon_del_filter(struct damon_filter *f)
> +{
> + list_del(&f->list);
> +}
> +
> static void damon_free_filter(struct damon_filter *f)
> {
> kfree(f);
> }
>
> +static void damon_destroy_filter(struct damon_filter *f)
> +{
> + damon_del_filter(f);
> + damon_free_filter(f);
> +}
> +
> +static struct damon_filter *damon_nth_filter(int n, struct damon_probe *p)
> +{
> + struct damon_filter *f;
> + int i = 0;
> +
> + damon_for_each_filter(f, p) {
> + if (i++ == n)
> + return f;
> + }
> + return NULL;
> +}
> +
> struct damon_probe *damon_new_probe(void)
> {
> struct damon_probe *p;
> @@ -171,6 +194,18 @@ static void damon_destroy_probe(struct damon_probe *p)
> damon_free_probe(p);
> }
>
> +static struct damon_probe *damon_nth_probe(int n, struct damon_ctx *ctx)
> +{
> + struct damon_probe *p;
> + int i = 0;
> +
> + damon_for_each_probe(p, ctx) {
> + if (i++ == n)
> + return p;
> + }
> + return NULL;
> +}
> +
> #ifdef CONFIG_DAMON_DEBUG_SANITY
> static void damon_verify_new_region(unsigned long start, unsigned long end)
> {
> @@ -1412,6 +1447,72 @@ static int damon_commit_targets(
> return 0;
> }
>
> +static void damon_commit_filter(struct damon_filter *dst,
> + struct damon_filter *src)
> +{
> + dst->type = src->type;
> + dst->matching = src->matching;
> + dst->allow = src->allow;
> +}
> +
> +static int damon_commit_filters(struct damon_probe *dst,
> + struct damon_probe *src)
> +{
> + struct damon_filter *dst_filter, *next, *src_filter, *new_filter;
> + int i = 0, j = 0;
> +
> + damon_for_each_filter_safe(dst_filter, next, dst) {
> + src_filter = damon_nth_filter(i++, src);
> + if (src_filter)
> + damon_commit_filter(dst_filter, src_filter);
> + else
> + damon_destroy_filter(dst_filter);
> + }
> +
> + damon_for_each_filter_safe(src_filter, next, src) {
> + if (j++ < i)
> + continue;
> +
> + new_filter = damon_new_filter(src_filter->type,
> + src_filter->matching, src_filter->allow);
> + if (!new_filter)
> + return -ENOMEM;
We should bail out here. If we return an error, we have already
committed some of the filters already. If there is an error, we
should remove any fill that was already added.
> + damon_add_filter(dst, new_filter);
> + }
> + return 0;
> +}
> +
> +static int damon_commit_probes(struct damon_ctx *dst, struct damon_ctx *src)
> +{
> + struct damon_probe *dst_probe, *next, *src_probe, *new_probe;
> + int i = 0, j = 0, err;
> +
> + damon_for_each_probe_safe(dst_probe, next, dst) {
> + src_probe = damon_nth_probe(i++, src);
> + if (src_probe) {
> + err = damon_commit_filters(dst_probe, src_probe);
> + if (err)
> + return err;
> + } else {
> + damon_destroy_probe(dst_probe);
> + }
> + }
> +
> + damon_for_each_probe_safe(src_probe, next, src) {
> + if (j++ < i)
> + continue;
> +
> + new_probe = damon_new_probe();
> + if (!new_probe)
> + return -ENOMEM;
The same as before, we should bail out.
> + damon_add_probe(dst, new_probe);
> + err = damon_commit_filters(new_probe, src_probe);
> + if (err)
> + return err;
> + }
> + return 0;
> +}
> +
> /**
> * damon_commit_ctx() - Commit parameters of a DAMON context to another.
> * @dst: The commit destination DAMON context.
> @@ -1453,6 +1554,9 @@ int damon_commit_ctx(struct damon_ctx *dst, struct damon_ctx *src)
> }
> dst->pause = src->pause;
> dst->ops = src->ops;
> + err = damon_commit_probes(dst, src);
> + if (err)
> + return err;
> dst->addr_unit = src->addr_unit;
> dst->min_region_sz = src->min_region_sz;
>

--
Asier Gutierrez
Huawei