]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/damon/reclaim: add a parameter called skip_anon for avoiding anonymous pages recla...
authorSeongJae Park <sj@kernel.org>
Mon, 5 Dec 2022 23:08:22 +0000 (23:08 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 19 Jan 2023 01:12:43 +0000 (17:12 -0800)
In some cases, for example if users have confidence at anonymous pages
management or the swap device is too slow, users would want to avoid
DAMON_RECLAIM swapping the anonymous pages out.  For such case, add yet
another DAMON_RECLAIM parameter, namely 'skip_anon'.  When it is set as
'Y', DAMON_RECLAIM will avoid reclaiming anonymous pages using a DAMOS
filter.

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

index e82631f394816f326b4d7da36f7703722058a099..648d2a85523abe613690c9890fd0729cd5a21a40 100644 (file)
@@ -98,6 +98,15 @@ module_param(monitor_region_start, ulong, 0600);
 static unsigned long monitor_region_end __read_mostly;
 module_param(monitor_region_end, ulong, 0600);
 
+/*
+ * Skip anonymous pages reclamation.
+ *
+ * If this parameter is set as ``Y``, DAMON_RECLAIM does not reclaim anonymous
+ * pages.  By default, ``N``.
+ */
+static bool skip_anon __read_mostly;
+module_param(skip_anon, bool, 0600);
+
 /*
  * PID of the DAMON thread
  *
@@ -142,6 +151,7 @@ static struct damos *damon_reclaim_new_scheme(void)
 static int damon_reclaim_apply_parameters(void)
 {
        struct damos *scheme;
+       struct damos_filter *filter;
        int err = 0;
 
        err = damon_set_attrs(ctx, &damon_reclaim_mon_attrs);
@@ -152,6 +162,15 @@ static int damon_reclaim_apply_parameters(void)
        scheme = damon_reclaim_new_scheme();
        if (!scheme)
                return -ENOMEM;
+       if (skip_anon) {
+               filter = damos_new_filter(DAMOS_FILTER_TYPE_ANON, true);
+               if (!filter) {
+                       /* Will be freed by next 'damon_set_schemes()' below */
+                       damon_destroy_scheme(scheme);
+                       return -ENOMEM;
+               }
+               damos_add_filter(scheme, filter);
+       }
        damon_set_schemes(ctx, &scheme, 1);
 
        return damon_set_region_biggest_system_ram_default(target,