mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 16:53:20 -04:00
mm/damon/sysfs-schemes: implement tried_regions/<r>/probes/
Implement a sysfs directory for showing the per-region probe hit counts. It is named 'probes/' and located under the DAMOS tried region directory. Link: https://lore.kernel.org/20260518234119.97569-16-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
24e969aa29
commit
b574a82d10
@@ -10,6 +10,32 @@
|
|||||||
|
|
||||||
#include "sysfs-common.h"
|
#include "sysfs-common.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* probes directory
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct damos_sysfs_probes {
|
||||||
|
struct kobject kobj;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct damos_sysfs_probes *damos_sysfs_probes_alloc(void)
|
||||||
|
{
|
||||||
|
return kzalloc_obj(struct damos_sysfs_probes);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void damos_sysfs_probes_release(struct kobject *kobj)
|
||||||
|
{
|
||||||
|
struct damos_sysfs_probes *probes = container_of(kobj,
|
||||||
|
struct damos_sysfs_probes, kobj);
|
||||||
|
|
||||||
|
kfree(probes);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct kobj_type damos_sysfs_probes_ktype = {
|
||||||
|
.release = damos_sysfs_probes_release,
|
||||||
|
.sysfs_ops = &kobj_sysfs_ops,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* scheme region directory
|
* scheme region directory
|
||||||
*/
|
*/
|
||||||
@@ -20,6 +46,7 @@ struct damon_sysfs_scheme_region {
|
|||||||
unsigned int nr_accesses;
|
unsigned int nr_accesses;
|
||||||
unsigned int age;
|
unsigned int age;
|
||||||
unsigned long sz_filter_passed;
|
unsigned long sz_filter_passed;
|
||||||
|
struct damos_sysfs_probes *probes;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -34,10 +61,36 @@ static struct damon_sysfs_scheme_region *damon_sysfs_scheme_region_alloc(
|
|||||||
sysfs_region->ar = region->ar;
|
sysfs_region->ar = region->ar;
|
||||||
sysfs_region->nr_accesses = region->nr_accesses_bp / 10000;
|
sysfs_region->nr_accesses = region->nr_accesses_bp / 10000;
|
||||||
sysfs_region->age = region->age;
|
sysfs_region->age = region->age;
|
||||||
|
sysfs_region->probes = NULL;
|
||||||
INIT_LIST_HEAD(&sysfs_region->list);
|
INIT_LIST_HEAD(&sysfs_region->list);
|
||||||
return sysfs_region;
|
return sysfs_region;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int damos_sysfs_region_add_dirs(
|
||||||
|
struct damon_sysfs_scheme_region *region)
|
||||||
|
{
|
||||||
|
struct damos_sysfs_probes *probes = damos_sysfs_probes_alloc();
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (!probes)
|
||||||
|
return -ENOMEM;
|
||||||
|
err = kobject_init_and_add(&probes->kobj, &damos_sysfs_probes_ktype,
|
||||||
|
®ion->kobj, "probes");
|
||||||
|
if (err) {
|
||||||
|
kobject_put(&probes->kobj);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
region->probes = probes;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void damos_sysfs_region_rm_dirs(
|
||||||
|
struct damon_sysfs_scheme_region *region)
|
||||||
|
{
|
||||||
|
kobject_put(®ion->probes->kobj);
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t start_show(struct kobject *kobj, struct kobj_attribute *attr,
|
static ssize_t start_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
@@ -163,6 +216,7 @@ static void damon_sysfs_scheme_regions_rm_dirs(
|
|||||||
struct damon_sysfs_scheme_region *r, *next;
|
struct damon_sysfs_scheme_region *r, *next;
|
||||||
|
|
||||||
list_for_each_entry_safe(r, next, ®ions->regions_list, list) {
|
list_for_each_entry_safe(r, next, ®ions->regions_list, list) {
|
||||||
|
damos_sysfs_region_rm_dirs(r);
|
||||||
list_del(&r->list);
|
list_del(&r->list);
|
||||||
kobject_put(&r->kobj);
|
kobject_put(&r->kobj);
|
||||||
regions->nr_regions--;
|
regions->nr_regions--;
|
||||||
@@ -2995,12 +3049,17 @@ void damos_sysfs_populate_region_dir(struct damon_sysfs_schemes *sysfs_schemes,
|
|||||||
if (kobject_init_and_add(®ion->kobj,
|
if (kobject_init_and_add(®ion->kobj,
|
||||||
&damon_sysfs_scheme_region_ktype,
|
&damon_sysfs_scheme_region_ktype,
|
||||||
&sysfs_regions->kobj, "%d",
|
&sysfs_regions->kobj, "%d",
|
||||||
sysfs_regions->nr_regions)) {
|
sysfs_regions->nr_regions))
|
||||||
kobject_put(®ion->kobj);
|
goto out;
|
||||||
return;
|
if (damos_sysfs_region_add_dirs(region))
|
||||||
}
|
goto out;
|
||||||
|
|
||||||
list_add_tail(®ion->list, &sysfs_regions->regions_list);
|
list_add_tail(®ion->list, &sysfs_regions->regions_list);
|
||||||
sysfs_regions->nr_regions++;
|
sysfs_regions->nr_regions++;
|
||||||
|
return;
|
||||||
|
|
||||||
|
out:
|
||||||
|
kobject_put(®ion->kobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
int damon_sysfs_schemes_clear_regions(
|
int damon_sysfs_schemes_clear_regions(
|
||||||
|
|||||||
Reference in New Issue
Block a user