[PATCH] mm/damon/stat: avoid iterating targets in damon_stat_sort_regions()

Enze Li posted 1 patch 1 month, 2 weeks ago
mm/damon/stat.c | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
[PATCH] mm/damon/stat: avoid iterating targets in damon_stat_sort_regions()
Posted by Enze Li 1 month, 2 weeks ago
damon/stat module creates only one target in damon_stat_build_ctx(), and
the comment in damon_stat_sort_regions() already says so.  But the code
still iterates adaptive_targets with damon_for_each_target(), which is
needlessly verbose and adds an extra indentation level.

Just use list_first_entry() to grab the single target, with a
list_empty() check to be safe.

Signed-off-by: Enze Li <lienze@kylinos.cn>
---
 mm/damon/stat.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/mm/damon/stat.c b/mm/damon/stat.c
index b05b68f73e10..c8b1e909bbac 100644
--- a/mm/damon/stat.c
+++ b/mm/damon/stat.c
@@ -91,16 +91,15 @@ static int damon_stat_sort_regions(struct damon_ctx *c,
 	unsigned int nr_regions = 0;
 	unsigned long total_sz = 0;
 
-	damon_for_each_target(t, c) {
-		/* there is only one target */
-		region_pointers = kmalloc_objs(*region_pointers,
-					       damon_nr_regions(t));
-		if (!region_pointers)
-			return -ENOMEM;
-		damon_for_each_region(r, t) {
-			region_pointers[nr_regions++] = r;
-			total_sz += r->ar.end - r->ar.start;
-		}
+	if (list_empty(&c->adaptive_targets))
+		return -EINVAL;
+	t = list_first_entry(&c->adaptive_targets, struct damon_target, list);
+	region_pointers = kmalloc_objs(*region_pointers, damon_nr_regions(t));
+	if (!region_pointers)
+		return -ENOMEM;
+	damon_for_each_region(r, t) {
+		region_pointers[nr_regions++] = r;
+		total_sz += r->ar.end - r->ar.start;
 	}
 	sort(region_pointers, nr_regions, sizeof(*region_pointers),
 			damon_stat_cmp_regions, NULL);

base-commit: 6c2cdf00fe5205942b5f29e16905603a1717b931
-- 
2.43.0
Re: [PATCH] mm/damon/stat: avoid iterating targets in damon_stat_sort_regions()
Posted by SJ Park 1 month, 2 weeks ago
On Fri, 14 Aug 2026 22:54:09 +0800 Enze Li <lienze@kylinos.cn> wrote:

> damon/stat module creates only one target in damon_stat_build_ctx(), and
> the comment in damon_stat_sort_regions() already says so.  But the code
> still iterates adaptive_targets with damon_for_each_target(), which is
> needlessly verbose and adds an extra indentation level.
> 
> Just use list_first_entry() to grab the single target, with a
> list_empty() check to be safe.

damon_ctx->adaptive_targetes is a private field.  DAMON API callers should
access the field using only public API that exposed on damon.h.  Let's not do
this.

If the verboseness and the indentation are problems, let's split out the code
to a function.


Thanks,
SJ

[...]