Commit 3607cc59 authored by SeongJae Park's avatar SeongJae Park Committed by Andrew Morton
Browse files

mm/damon/core: support committing ops_filters

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: default avatarSeongJae Park <sj@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent ac7b094b
Loading
Loading
Loading
Loading
+39 −1
Original line number Diff line number Diff line
@@ -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;