[RFC PATCH v3 2/8] mm/damon/core: commit hugepage_size type damon filter
From: SJ Park
Date: Mon Sep 14 2026 - 22:15:31 EST
Extend data attribute probe filters commit logic for the new
hugepage_size filter type. Since it needs to carry the size range of
the hugepage, update the logic to update the size range fields of the
commit destination filter struct. While doing that, validate the given
range and propagate an error if it is invalid. Add the error handling
in the callers, too.
Signed-off-by: SJ Park <sj@xxxxxxxxxx>
---
mm/damon/core.c | 28 +++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 5212bfb8f85f2..2c9cbcff37fac 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -1818,7 +1818,7 @@ static int damon_commit_preps(struct damon_probe *dst, struct damon_probe *src)
return 0;
}
-static void damon_commit_filter(struct damon_filter *dst,
+static int damon_commit_filter(struct damon_filter *dst,
struct damon_filter *src)
{
dst->type = src->type;
@@ -1828,23 +1828,33 @@ static void damon_commit_filter(struct damon_filter *dst,
case DAMON_FILTER_TYPE_MEMCG:
dst->memcg_id = src->memcg_id;
break;
+ case DAMON_FILTER_TYPE_HUGEPAGE_SIZE:
+ if (src->range_max < src->range_min)
+ return -EINVAL;
+ dst->range_min = src->range_min;
+ dst->range_max = src->range_max;
+ break;
default:
break;
}
+ return 0;
}
static int damon_commit_filters(struct damon_probe *dst,
struct damon_probe *src)
{
struct damon_filter *dst_filter, *next, *src_filter, *new_filter;
- int i = 0, j = 0;
+ int i = 0, j = 0, err;
damon_for_each_filter_safe(dst_filter, next, dst) {
src_filter = damon_nth_filter(i++, src);
- if (src_filter)
- damon_commit_filter(dst_filter, src_filter);
- else
+ if (src_filter) {
+ err = damon_commit_filter(dst_filter, src_filter);
+ if (err)
+ return err;
+ } else {
damon_destroy_filter(dst_filter);
+ }
}
damon_for_each_filter_safe(src_filter, next, src) {
@@ -1859,6 +1869,14 @@ static int damon_commit_filters(struct damon_probe *dst,
case DAMON_FILTER_TYPE_MEMCG:
new_filter->memcg_id = src_filter->memcg_id;
break;
+ case DAMON_FILTER_TYPE_HUGEPAGE_SIZE:
+ if (src_filter->range_max < src_filter->range_min) {
+ damon_destroy_filter(new_filter);
+ return -EINVAL;
+ }
+ new_filter->range_min = src_filter->range_min;
+ new_filter->range_max = src_filter->range_max;
+ break;
default:
break;
}
--
2.47.3