]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/damon/sysfs-schemes: implement probe/hits file
authorSeongJae Park <sj@kernel.org>
Mon, 18 May 2026 23:41:05 +0000 (16:41 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 2 Jun 2026 22:22:28 +0000 (15:22 -0700)
Implement sysfs file for showing the per-region per-probe hits count.

Link: https://lore.kernel.org/20260518234119.97569-18-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 7e21e78d77512a6656a8361198e8ec20aed9177a..e25f4824b72fd4867eebf0bb8d13deef2cb52d15 100644 (file)
 
 struct damos_sysfs_probe {
        struct kobject kobj;
+       unsigned char hits;
 };
 
-static struct damos_sysfs_probe *damos_sysfs_probe_alloc(void)
+static struct damos_sysfs_probe *damos_sysfs_probe_alloc(unsigned char hits)
 {
-       return kzalloc_obj(struct damos_sysfs_probe);
+       struct damos_sysfs_probe *probe;
+
+       probe = kzalloc_obj(*probe);
+       if (!probe)
+               return NULL;
+       probe->hits = hits;
+       return probe;
+}
+
+static ssize_t hits_show(struct kobject *kobj, struct kobj_attribute *attr,
+               char *buf)
+{
+       struct damos_sysfs_probe *probe = container_of(kobj,
+                       struct damos_sysfs_probe, kobj);
+
+       return sysfs_emit(buf, "%hhu\n", probe->hits);
 }
 
 static void damos_sysfs_probe_release(struct kobject *kobj)
@@ -31,9 +47,19 @@ static void damos_sysfs_probe_release(struct kobject *kobj)
        kfree(probe);
 }
 
+static struct kobj_attribute damos_sysfs_probe_hits_attr =
+               __ATTR_RO_MODE(hits, 0400);
+
+static struct attribute *damos_sysfs_probe_attrs[] = {
+       &damos_sysfs_probe_hits_attr.attr,
+       NULL,
+};
+ATTRIBUTE_GROUPS(damos_sysfs_probe);
+
 static const struct kobj_type damos_sysfs_probe_ktype = {
        .release = damos_sysfs_probe_release,
        .sysfs_ops = &kobj_sysfs_ops,
+       .default_groups = damos_sysfs_probe_groups,
 };
 
 /*
@@ -64,7 +90,7 @@ static void damos_sysfs_probes_rm_dirs(struct damos_sysfs_probes *probes)
 }
 
 static int damos_sysfs_probes_add_dirs(struct damos_sysfs_probes *probes,
-               struct damon_ctx *ctx)
+               struct damon_ctx *ctx, struct damon_region *region)
 {
        struct damon_probe *probe;
        struct damos_sysfs_probe **probes_arr;
@@ -86,7 +112,7 @@ static int damos_sysfs_probes_add_dirs(struct damos_sysfs_probes *probes,
                struct damos_sysfs_probe *sys_probe;
                int err;
 
-               sys_probe = damos_sysfs_probe_alloc();
+               sys_probe = damos_sysfs_probe_alloc(region->probe_hits[i]);
                if (!sys_probe) {
                        damos_sysfs_probes_rm_dirs(probes);
                        return -ENOMEM;
@@ -150,7 +176,8 @@ static struct damon_sysfs_scheme_region *damon_sysfs_scheme_region_alloc(
 
 static int damos_sysfs_region_add_dirs(
                struct damon_sysfs_scheme_region *region,
-               struct damon_ctx *ctx)
+               struct damon_ctx *ctx,
+               struct damon_region *dregion)
 {
        struct damos_sysfs_probes *probes = damos_sysfs_probes_alloc();
        int err;
@@ -161,7 +188,7 @@ static int damos_sysfs_region_add_dirs(
                        &region->kobj, "probes");
        if (err)
                goto fail;
-       err = damos_sysfs_probes_add_dirs(probes, ctx);
+       err = damos_sysfs_probes_add_dirs(probes, ctx, dregion);
        if (err)
                goto fail;
 
@@ -3140,7 +3167,7 @@ void damos_sysfs_populate_region_dir(struct damon_sysfs_schemes *sysfs_schemes,
                                &sysfs_regions->kobj, "%d",
                                sysfs_regions->nr_regions))
                goto out;
-       if (damos_sysfs_region_add_dirs(region, ctx))
+       if (damos_sysfs_region_add_dirs(region, ctx, r))
                goto out;
 
        list_add_tail(&region->list, &sysfs_regions->regions_list);