summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mm/damon/core.c21
-rw-r--r--mm/damon/tests/core-kunit.h2
2 files changed, 14 insertions, 9 deletions
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 806a67d02a6e..6c4215cc809e 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -3308,7 +3308,7 @@ static unsigned int damon_merge_score(struct damon_region *r, bool last,
* sz_limit size upper limit of each region
*/
static void damon_merge_regions_of(struct damon_target *t, unsigned int thres,
- unsigned long sz_limit, struct damon_ctx *ctx)
+ unsigned long sz_limit, struct damon_ctx *ctx, bool count_age)
{
struct damon_region *r, *prev = NULL, *next;
bool use_probe_hits = damon_has_probe_weights(ctx);
@@ -3319,12 +3319,14 @@ static void damon_merge_regions_of(struct damon_target *t, unsigned int thres,
score = damon_merge_score(r, false, ctx, use_probe_hits);
last_score = damon_merge_score(r, true, ctx, use_probe_hits);
- if (abs_diff(score, last_score) > thres)
- r->age = 0;
- else if ((score == 0) != (last_score == 0))
- r->age = 0;
- else
- r->age++;
+ if (count_age) {
+ if (abs_diff(score, last_score) > thres)
+ r->age = 0;
+ else if ((score == 0) != (last_score == 0))
+ r->age = 0;
+ else
+ r->age++;
+ }
if (!prev)
goto set_prev_continue;
@@ -3366,15 +3368,18 @@ static void kdamond_merge_regions(struct damon_ctx *c, unsigned int threshold,
struct damon_target *t;
unsigned int nr_regions;
unsigned int max_thres;
+ bool count_age = true;
max_thres = c->attrs.aggr_interval /
(c->attrs.sample_interval ? c->attrs.sample_interval : 1);
do {
nr_regions = 0;
damon_for_each_target(t, c) {
- damon_merge_regions_of(t, threshold, sz_limit, c);
+ damon_merge_regions_of(t, threshold, sz_limit, c,
+ count_age);
nr_regions += damon_nr_regions(t);
}
+ count_age = false;
threshold = max(1, threshold * 2);
} while (nr_regions > c->attrs.max_nr_regions &&
threshold / 2 < max_thres);
diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h
index 73cb8fcdf07e..485472ddebd1 100644
--- a/mm/damon/tests/core-kunit.h
+++ b/mm/damon/tests/core-kunit.h
@@ -257,7 +257,7 @@ static void damon_test_merge_regions_of(struct kunit *test)
damon_add_region(r, t);
}
- damon_merge_regions_of(t, 9, 9999, ctx);
+ damon_merge_regions_of(t, 9, 9999, ctx, true);
/* 0-112, 114-130, 130-156, 156-170, 170-230, 230-10170 */
KUNIT_EXPECT_EQ(test, damon_nr_regions(t), 6u);
for (i = 0; i < 6; i++) {