summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeongJae Park <sj@kernel.org>2026-05-18 16:41:03 -0700
committerAndrew Morton <akpm@linux-foundation.org>2026-06-02 15:22:28 -0700
commitb574a82d10de9c32ddc005c6a5d92e037f35ed43 (patch)
treec2a556e21878a868e7f5617ff3240d8886987a0e
parent24e969aa296c1b02b797420a428315a525540420 (diff)
downloadlinux-b574a82d10de9c32ddc005c6a5d92e037f35ed43.tar.gz
linux-b574a82d10de9c32ddc005c6a5d92e037f35ed43.zip
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>
-rw-r--r--mm/damon/sysfs-schemes.c67
1 files changed, 63 insertions, 4 deletions
diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c
index 0d3021db0b99..3b66c3a757b2 100644
--- a/mm/damon/sysfs-schemes.c
+++ b/mm/damon/sysfs-schemes.c
@@ -11,6 +11,32 @@
#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(