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: SeongJae Park <sj@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
SeongJae Park 2025-01-06 11:33:57 -08:00 committed by Andrew Morton
parent e1a1d377e4
commit cfc33a7d2d
3 changed files with 6 additions and 5 deletions

View File

@ -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 */

View File

@ -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);

View File

@ -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;