Reclaim at boot now controllable from the config 25/204825/4
authorMichal Bloch <m.bloch@samsung.com>
Fri, 26 Apr 2019 14:59:40 +0000 (16:59 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Mon, 6 May 2019 12:15:35 +0000 (14:15 +0200)
Introduce two new config fields to `swap.conf`:
 * `ReclaimAtBoot` controls whether this behaviour happens at all (bool)
 * `TimerReclaimAtBoot` controls how long (in seconds) to wait
   until the reclaim happens after booting is done (int)

The feature is now disabled by default.
When enabled, the default timer is still 60s.

Change-Id: I5008248541169156070b3c24fdd7b275e39b8f56
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
src/swap/swap.c
src/swap/swap.conf

index b65f699..505776b 100644 (file)
@@ -69,7 +69,9 @@
 #define SWAP_RECLAIM_PAGES_MIN         128
 #define SWAP_MEMCG_SWAPPINESS          60
 #define SWAP_MIN_SWAPPINESS            0
-#define SWAP_EARLYRECALIM_TIME 60
+#define SWAP_EARLYRECLAIM_TIME_DEFAULT 60
+
+#define EARLYRECLAIM_WITH_AN_EXPLANATION_FOR_LAYMEN "early memory reclaim (done to retrieve resources used by daemons during system start-up)"
 
 enum swap_thread_op {
        SWAP_OP_ACTIVATE,
@@ -109,6 +111,8 @@ static enum swap_reclaim_node swap_node;
 static enum swap_state swap_state;
 
 static bool arg_swap_enable = false;
+static bool arg_swap_at_boot = false;
+static int arg_timer_swap_at_boot = SWAP_EARLYRECLAIM_TIME_DEFAULT;
 static enum swap_type arg_swap_type = SWAP_TYPE_ZRAM;
 static int current_swappiness = SWAP_MEMCG_SWAPPINESS;
 
@@ -793,7 +797,6 @@ static int swap_communicate_thread(struct swap_thread_bundle *bundle)
 
        _E("pthread_mutex_trylock fail: %d, errno: %d", ret, errno);
        return RESOURCED_ERROR_FAIL;
-
 }
 
 static int swap_start_handler(void *data)
@@ -842,6 +845,7 @@ static int swap_activate_handler(void *data)
 
 static gboolean swap_activate_timer_cb(gpointer data)
 {
+       _I("Starting an " EARLYRECLAIM_WITH_AN_EXPLANATION_FOR_LAYMEN);
        swap_activating_timer = NULL;
        swap_internal_bundle_sender(SWAP_OP_ACTIVATE);
        return false;
@@ -849,7 +853,22 @@ static gboolean swap_activate_timer_cb(gpointer data)
 
 static int swap_booting_done(void *data)
 {
-       swap_activating_timer = g_timeout_source_new_seconds(SWAP_EARLYRECALIM_TIME);
+       if (!arg_swap_at_boot) {
+               _D(EARLYRECLAIM_WITH_AN_EXPLANATION_FOR_LAYMEN " is disabled");
+               return RESOURCED_ERROR_NONE;
+       }
+
+       /* No need to involve the timer mechanism when the delay is 0,
+        * partially to keep things simple but primarily because it can
+        * introduce an artificial delay since the timer is ran async
+        * in another thread. */
+       if (arg_timer_swap_at_boot == 0) {
+               swap_activate_timer_cb(NULL);
+               return RESOURCED_ERROR_NONE;
+       }
+
+       _D("booting done; starting up a timer to perform an " EARLYRECLAIM_WITH_AN_EXPLANATION_FOR_LAYMEN " %ds from now", arg_timer_swap_at_boot);
+       swap_activating_timer = g_timeout_source_new_seconds((guint) arg_timer_swap_at_boot);
        g_source_set_callback(swap_activating_timer, swap_activate_timer_cb, NULL, NULL);
        g_source_attach(swap_activating_timer, NULL);
 
@@ -959,6 +978,10 @@ static int swap_parse_config_file(void)
                        0,      &arg_swap_enable        },
                { "SWAP",       "Type",                 config_parse_swap_types,
                        0,      &arg_swap_type  },
+               { "SWAP",       "ReclaimAtBoot",        config_parse_bool,
+                       0,      &arg_swap_at_boot       },
+               { "SWAP",       "TimerReclaimAtBoot",   config_parse_int,
+                       0,      &arg_timer_swap_at_boot },
                { NULL,         NULL,                   NULL,
                        0,      NULL    }
        };
@@ -971,6 +994,13 @@ static int swap_parse_config_file(void)
                return r;
        }
 
+       /* `g_timeout_source_new_seconds` wants an unsigned value,
+        * but there is no `config_parse_uint` to produce one. */
+       if (arg_timer_swap_at_boot < 0) {
+               _E("The `TimerReclaimAtBoot` field in the `" SWAP_CONF_FILE "` config file cannot be negative because it represents a time period for " EARLYRECLAIM_WITH_AN_EXPLANATION_FOR_LAYMEN);
+               return -EINVAL;
+       }
+
        return 0;
 }
 
index 5ebd033..9267e1d 100644 (file)
@@ -2,6 +2,8 @@
 ## Enable/Disable swap devices. (default is disable)
 # Enable=yes or 1 or true / Disalbe=no or 0 or false
 Enable=1
+ReclaimAtBoot=no
+TimerReclaimAtBoot=60
 
 ## swap device type. zram, file and zswap are available.
 ## Multiple swap devices are specified witn '+'.