mm/damon/core: embed damon_probe objects in damon_ctx

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>
This commit is contained in:
SeongJae Park
2026-05-18 16:40:50 -07:00
committed by Andrew Morton
parent 45c49d9fd6
commit 18c777859f
2 changed files with 47 additions and 0 deletions

View 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);
/*

View 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);
}