mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
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:
committed by
Andrew Morton
parent
45c49d9fd6
commit
18c777859f
@@ -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);
|
||||
|
||||
/*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user