summaryrefslogtreecommitdiff
path: root/mm/damon/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/damon/core.c')
-rw-r--r--mm/damon/core.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 68a5fb1c039d..c1f1483c5082 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -877,13 +877,23 @@ static void damos_update_stat(struct damos *s,
s->stat.sz_applied += sz_applied;
}
-static bool __damos_filter_out(struct damon_target *t, struct damon_region *r,
- struct damos_filter *filter)
+static bool __damos_filter_out(struct damon_ctx *ctx, struct damon_target *t,
+ struct damon_region *r, struct damos_filter *filter)
{
bool matched = false;
+ struct damon_target *ti;
+ int target_idx = 0;
unsigned long start, end;
switch (filter->type) {
+ case DAMOS_FILTER_TYPE_TARGET:
+ damon_for_each_target(ti, ctx) {
+ if (ti == t)
+ break;
+ target_idx++;
+ }
+ matched = target_idx == filter->target_idx;
+ break;
case DAMOS_FILTER_TYPE_ADDR:
start = ALIGN_DOWN(filter->addr_range.start, DAMON_MIN_REGION);
end = ALIGN_DOWN(filter->addr_range.end, DAMON_MIN_REGION);
@@ -915,13 +925,13 @@ static bool __damos_filter_out(struct damon_target *t, struct damon_region *r,
return matched == filter->matching;
}
-static bool damos_filter_out(struct damon_target *t, struct damon_region *r,
- struct damos *s)
+static bool damos_filter_out(struct damon_ctx *ctx, struct damon_target *t,
+ struct damon_region *r, struct damos *s)
{
struct damos_filter *filter;
damos_for_each_filter(filter, s) {
- if (__damos_filter_out(t, r, filter))
+ if (__damos_filter_out(ctx, t, r, filter))
return true;
}
return false;
@@ -944,7 +954,7 @@ static void damos_apply_scheme(struct damon_ctx *c, struct damon_target *t,
goto update_stat;
damon_split_region_at(t, r, sz);
}
- if (damos_filter_out(t, r, s))
+ if (damos_filter_out(c, t, r, s))
return;
ktime_get_coarse_ts64(&begin);
if (c->callback.before_damos_apply)