mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 14:23:49 +01: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/[email protected] Signed-off-by: SeongJae Park <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Jonathan Corbet <[email protected]> Cc: Liam R. Howlett <[email protected]> Cc: Lorenzo Stoakes <[email protected]> Cc: "Masami Hiramatsu (Google)" <[email protected]> Cc: Mathieu Desnoyers <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Shuah Khan <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Suren Baghdasaryan <[email protected]> Cc: Vlastimil Babka <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
45c49d9fd6
commit
18c777859f
2 files changed
+47
No files matched your search
@@ -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