mm/damon/reclaim: provide reclamation statistics
authorSeongJae Park <sj@kernel.org>
Fri, 14 Jan 2022 22:10:23 +0000 (14:10 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 15 Jan 2022 14:30:33 +0000 (16:30 +0200)
This implements new DAMON_RECLAIM parameters for statistics reporting.
Those can be used for understanding how DAMON_RECLAIM is working, and
for tuning the other parameters.

Link: https://lkml.kernel.org/r/20211210150016.35349-4-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/damon/reclaim.c

index dc14850..bc476ce 100644 (file)
@@ -185,6 +185,36 @@ module_param(monitor_region_end, ulong, 0600);
 static int kdamond_pid __read_mostly = -1;
 module_param(kdamond_pid, int, 0400);
 
+/*
+ * Number of memory regions that tried to be reclaimed.
+ */
+static unsigned long nr_reclaim_tried_regions __read_mostly;
+module_param(nr_reclaim_tried_regions, ulong, 0400);
+
+/*
+ * Total bytes of memory regions that tried to be reclaimed.
+ */
+static unsigned long bytes_reclaim_tried_regions __read_mostly;
+module_param(bytes_reclaim_tried_regions, ulong, 0400);
+
+/*
+ * Number of memory regions that successfully be reclaimed.
+ */
+static unsigned long nr_reclaimed_regions __read_mostly;
+module_param(nr_reclaimed_regions, ulong, 0400);
+
+/*
+ * Total bytes of memory regions that successfully be reclaimed.
+ */
+static unsigned long bytes_reclaimed_regions __read_mostly;
+module_param(bytes_reclaimed_regions, ulong, 0400);
+
+/*
+ * Number of times that the time/space quota limits have exceeded
+ */
+static unsigned long nr_quota_exceeds __read_mostly;
+module_param(nr_quota_exceeds, ulong, 0400);
+
 static struct damon_ctx *ctx;
 static struct damon_target *target;
 
@@ -333,6 +363,21 @@ static void damon_reclaim_timer_fn(struct work_struct *work)
 }
 static DECLARE_DELAYED_WORK(damon_reclaim_timer, damon_reclaim_timer_fn);
 
+static int damon_reclaim_after_aggregation(struct damon_ctx *c)
+{
+       struct damos *s;
+
+       /* update the stats parameter */
+       damon_for_each_scheme(s, c) {
+               nr_reclaim_tried_regions = s->stat.nr_tried;
+               bytes_reclaim_tried_regions = s->stat.sz_tried;
+               nr_reclaimed_regions = s->stat.nr_applied;
+               bytes_reclaimed_regions = s->stat.sz_applied;
+               nr_quota_exceeds = s->stat.qt_exceeds;
+       }
+       return 0;
+}
+
 static int __init damon_reclaim_init(void)
 {
        ctx = damon_new_ctx();
@@ -340,6 +385,7 @@ static int __init damon_reclaim_init(void)
                return -ENOMEM;
 
        damon_pa_set_primitives(ctx);
+       ctx->callback.after_aggregation = damon_reclaim_after_aggregation;
 
        /* 4242 means nothing but fun */
        target = damon_new_target(4242);