]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/damon/core: embed damon_probe objects in damon_ctx
authorSeongJae Park <sj@kernel.org>
Mon, 18 May 2026 23:40:50 +0000 (16:40 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 2 Jun 2026 22:22:25 +0000 (15:22 -0700)
Let damon_probe objects be able to be installed on a given damon_ctx, by
adding a linked list header for storing the objects.  Add initialization
and cleanup of the new field with helper functions, too.

Link: https://lore.kernel.org/20260518234119.97569-3-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Liam R. Howlett <liam@infradead.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/damon.h
mm/damon/core.c

index 4794931fa2ea3f2de990e2cbad103341ff7df473..43d71eb24ccb6a5b32a5f58c593390af39617139 100644 (file)
@@ -857,6 +857,7 @@ struct damon_ctx {
 
 /* public: */
        struct damon_operations ops;
+       struct list_head probes;
        unsigned long addr_unit;
        unsigned long min_region_sz;
        bool pause;
@@ -909,6 +910,11 @@ static inline unsigned long damon_sz_region(struct damon_region *r)
        return r->ar.end - r->ar.start;
 }
 
+#define damon_for_each_probe(p, ctx) \
+       list_for_each_entry(p, &(ctx)->probes, list)
+
+#define damon_for_each_probe_safe(p, next, ctx) \
+       list_for_each_entry_safe(p, next, &(ctx)->probes, list)
 
 #define damon_for_each_region(r, t) \
        list_for_each_entry(r, &t->regions_list, list)
@@ -951,6 +957,9 @@ static inline unsigned long damon_sz_region(struct damon_region *r)
 
 #ifdef CONFIG_DAMON
 
+struct damon_probe *damon_new_probe(void);
+void damon_add_probe(struct damon_ctx *ctx, struct damon_probe *probe);
+
 struct damon_region *damon_new_region(unsigned long start, unsigned long end);
 
 /*
index 3a8725e400c6b89572cc387ad854e34ce26f66d6..8a55cc61d2972b4984cc3455dfa98ff6d2d63a75 100644 (file)
@@ -113,6 +113,38 @@ int damon_select_ops(struct damon_ctx *ctx, enum damon_ops_id id)
        return err;
 }
 
+struct damon_probe *damon_new_probe(void)
+{
+       struct damon_probe *p;
+
+       p = kmalloc_obj(*p);
+       if (!p)
+               return NULL;
+       INIT_LIST_HEAD(&p->list);
+       return p;
+}
+
+void damon_add_probe(struct damon_ctx *ctx, struct damon_probe *probe)
+{
+       list_add_tail(&probe->list, &ctx->probes);
+}
+
+static void damon_del_probe(struct damon_probe *p)
+{
+       list_del(&p->list);
+}
+
+static void damon_free_probe(struct damon_probe *p)
+{
+       kfree(p);
+}
+
+static void damon_destroy_probe(struct damon_probe *p)
+{
+       damon_del_probe(p);
+       damon_free_probe(p);
+}
+
 #ifdef CONFIG_DAMON_DEBUG_SANITY
 static void damon_verify_new_region(unsigned long start, unsigned long end)
 {
@@ -605,6 +637,8 @@ struct damon_ctx *damon_new_ctx(void)
        ctx->attrs.min_nr_regions = 10;
        ctx->attrs.max_nr_regions = 1000;
 
+       INIT_LIST_HEAD(&ctx->probes);
+
        ctx->addr_unit = 1;
        ctx->min_region_sz = DAMON_MIN_REGION_SZ;
 
@@ -627,12 +661,16 @@ static void damon_destroy_targets(struct damon_ctx *ctx)
 void damon_destroy_ctx(struct damon_ctx *ctx)
 {
        struct damos *s, *next_s;
+       struct damon_probe *p, *next_p;
 
        damon_destroy_targets(ctx);
 
        damon_for_each_scheme_safe(s, next_s, ctx)
                damon_destroy_scheme(s);
 
+       damon_for_each_probe_safe(p, next_p, ctx)
+               damon_destroy_probe(p);
+
        kfree(ctx);
 }