]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/damon/core: support committing ops_filters
authorSeongJae Park <sj@kernel.org>
Tue, 4 Mar 2025 21:19:07 +0000 (13:19 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Mar 2025 07:05:38 +0000 (00:05 -0700)
DAMON kernel API callers should use damon_commit_ctx() to install DAMON
parameters including DAMOS filters.  But damos_commit_ops_filters(), which
is called by damon_commit_ctx() for filters installing, is not handling
damos->ops_filters.  Hence, no DAMON kernel API caller can use
damos->ops_filters.  Do the committing of the ops_filters to make it
usable.

Link: https://lkml.kernel.org/r/20250304211913.53574-4-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/core.c

index 5415b7603d014a07dc753ba44685e5456ab27fcf..1daccccb5d67b54b0059572a6f6627c4e5da08e3 100644 (file)
@@ -820,7 +820,7 @@ static void damos_commit_filter(
        damos_commit_filter_arg(dst, src);
 }
 
-static int damos_commit_filters(struct damos *dst, struct damos *src)
+static int damos_commit_core_filters(struct damos *dst, struct damos *src)
 {
        struct damos_filter *dst_filter, *next, *src_filter, *new_filter;
        int i = 0, j = 0;
@@ -848,6 +848,44 @@ static int damos_commit_filters(struct damos *dst, struct damos *src)
        return 0;
 }
 
+static int damos_commit_ops_filters(struct damos *dst, struct damos *src)
+{
+       struct damos_filter *dst_filter, *next, *src_filter, *new_filter;
+       int i = 0, j = 0;
+
+       damos_for_each_ops_filter_safe(dst_filter, next, dst) {
+               src_filter = damos_nth_filter(i++, src);
+               if (src_filter)
+                       damos_commit_filter(dst_filter, src_filter);
+               else
+                       damos_destroy_filter(dst_filter);
+       }
+
+       damos_for_each_ops_filter_safe(src_filter, next, src) {
+               if (j++ < i)
+                       continue;
+
+               new_filter = damos_new_filter(
+                               src_filter->type, src_filter->matching,
+                               src_filter->allow);
+               if (!new_filter)
+                       return -ENOMEM;
+               damos_commit_filter_arg(new_filter, src_filter);
+               damos_add_filter(dst, new_filter);
+       }
+       return 0;
+}
+
+static int damos_commit_filters(struct damos *dst, struct damos *src)
+{
+       int err;
+
+       err = damos_commit_core_filters(dst, src);
+       if (err)
+               return err;
+       return damos_commit_ops_filters(dst, src);
+}
+
 static struct damos *damon_nth_scheme(int n, struct damon_ctx *ctx)
 {
        struct damos *s;