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

mm/damon/core: pass per-region filter-passed bytes to damos_walk_control->walk_fn()

Total size of memory that passed DAMON operations set layer-handled DAMOS
filters per scheme is provided to DAMON core API and ABI (sysfs interface)
users.  Having it per-region in non-accumulated way can provide it in
finer granularity.  Provide it to damos_walk() core API users, by passing
the data to damos_walk_control->walk_fn().

Link: https://lkml.kernel.org/r/20250106193401.109161-13-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 e1a1d377
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -388,7 +388,7 @@ struct damos;
struct damos_walk_control {
	void (*walk_fn)(void *data, struct damon_ctx *ctx,
			struct damon_target *t, struct damon_region *r,
			struct damos *s);
			struct damos *s, unsigned long sz_filter_passed);
	void *data;
/* private: internal use only */
	/* informs if the kdamond finished handling of the walk request */
+4 −3
Original line number Diff line number Diff line
@@ -1445,7 +1445,8 @@ static bool damos_filter_out(struct damon_ctx *ctx, struct damon_target *t,
 * installed by damos_walk() and not yet uninstalled, invoke it.
 */
static void damos_walk_call_walk(struct damon_ctx *ctx, struct damon_target *t,
		struct damon_region *r, struct damos *s)
		struct damon_region *r, struct damos *s,
		unsigned long sz_filter_passed)
{
	struct damos_walk_control *control;

@@ -1454,7 +1455,7 @@ static void damos_walk_call_walk(struct damon_ctx *ctx, struct damon_target *t,
	mutex_unlock(&ctx->walk_control_lock);
	if (!control)
		return;
	control->walk_fn(control->data, ctx, t, r, s);
	control->walk_fn(control->data, ctx, t, r, s, sz_filter_passed);
}

/*
@@ -1574,7 +1575,7 @@ static void damos_apply_scheme(struct damon_ctx *c, struct damon_target *t,
			sz_applied = c->ops.apply_scheme(c, t, r, s,
					&sz_ops_filter_passed);
		}
		damos_walk_call_walk(c, t, r, s);
		damos_walk_call_walk(c, t, r, s, sz_ops_filter_passed);
		ktime_get_coarse_ts64(&end);
		quota->total_charged_ns += timespec64_to_ns(&end) -
			timespec64_to_ns(&begin);
+1 −1
Original line number Diff line number Diff line
@@ -1454,7 +1454,7 @@ struct damon_sysfs_schemes_walk_data {
/* populate the region directory */
static void damon_sysfs_schemes_tried_regions_upd_one(void *data, struct damon_ctx *ctx,
		struct damon_target *t, struct damon_region *r,
		struct damos *s)
		struct damos *s, unsigned long sz_filter_passed)
{
	struct damon_sysfs_schemes_walk_data *walk_data = data;
	struct damon_sysfs_kdamond *sysfs_kdamond = walk_data->sysfs_kdamond;