damon_commit_target_regions() walks the source region list twice: once
to count regions and again to copy their address ranges. Use the
already-maintained damon_nr_regions() instead of the counting traversal.
Signed-off-by: Josh Law <objecting@objecting.org>
---
mm/damon/core.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 56372e577931..6c1f738e265c 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -1217,17 +1217,15 @@ static int damon_commit_target_regions(struct damon_target *dst,
{
struct damon_region *src_region;
struct damon_addr_range *ranges;
+ unsigned int nr = damon_nr_regions(src);
int i = 0, err;
- damon_for_each_region(src_region, src)
- i++;
- if (!i)
+ if (!nr)
return 0;
- ranges = kmalloc_objs(*ranges, i, GFP_KERNEL | __GFP_NOWARN);
+ ranges = kmalloc_objs(*ranges, nr, GFP_KERNEL | __GFP_NOWARN);
if (!ranges)
return -ENOMEM;
- i = 0;
damon_for_each_region(src_region, src)
ranges[i++] = src_region->ar;
err = damon_set_regions(dst, ranges, i, src_min_region_sz);
--
2.34.1