]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/damon/sysfs-schemes: implement tried_regions/<r>/probes/
authorSeongJae Park <sj@kernel.org>
Mon, 18 May 2026 23:41:03 +0000 (16:41 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 2 Jun 2026 22:22:28 +0000 (15:22 -0700)
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>
mm/damon/sysfs-schemes.c

index 0d3021db0b99bfa1a93c6e4cceda7d50e8636fa5..3b66c3a757b2aaa6c939f2bc6f311e2d3e7b6c69 100644 (file)
 
 #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
  */
@@ -20,6 +46,7 @@ struct damon_sysfs_scheme_region {
        unsigned int nr_accesses;
        unsigned int age;
        unsigned long sz_filter_passed;
+       struct damos_sysfs_probes *probes;
        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->nr_accesses = region->nr_accesses_bp / 10000;
        sysfs_region->age = region->age;
+       sysfs_region->probes = NULL;
        INIT_LIST_HEAD(&sysfs_region->list);
        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,
+                       &region->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(&region->probes->kobj);
+}
+
 static ssize_t start_show(struct kobject *kobj, struct kobj_attribute *attr,
                char *buf)
 {
@@ -163,6 +216,7 @@ static void damon_sysfs_scheme_regions_rm_dirs(
        struct damon_sysfs_scheme_region *r, *next;
 
        list_for_each_entry_safe(r, next, &regions->regions_list, list) {
+               damos_sysfs_region_rm_dirs(r);
                list_del(&r->list);
                kobject_put(&r->kobj);
                regions->nr_regions--;
@@ -2995,12 +3049,17 @@ void damos_sysfs_populate_region_dir(struct damon_sysfs_schemes *sysfs_schemes,
        if (kobject_init_and_add(&region->kobj,
                                &damon_sysfs_scheme_region_ktype,
                                &sysfs_regions->kobj, "%d",
-                               sysfs_regions->nr_regions)) {
-               kobject_put(&region->kobj);
-               return;
-       }
+                               sysfs_regions->nr_regions))
+               goto out;
+       if (damos_sysfs_region_add_dirs(region))
+               goto out;
+
        list_add_tail(&region->list, &sysfs_regions->regions_list);
        sysfs_regions->nr_regions++;
+       return;
+
+out:
+       kobject_put(&region->kobj);
 }
 
 int damon_sysfs_schemes_clear_regions(