summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2025-02-09 02:27:53 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2025-02-09 02:27:53 +0100
commit4bbdda186cbd5f2bd377c1a03b1b09efdab6dd23 (patch)
tree72e10add6ae1f573733c7b79a9b7ec4684458f82
parent41bf21a9d8e5b6b9172fabab7c8186c51d0c4524 (diff)
swapon: Auto-start mach-defpager
Which allows not to start it unless swap is configured, so Mach can know when it is not and avoid trying to use a default memory manager.
-rw-r--r--daemons/runsystem.sh4
-rw-r--r--sutils/swapon.c26
2 files changed, 22 insertions, 8 deletions
diff --git a/daemons/runsystem.sh b/daemons/runsystem.sh
index c3d37000..c2bc48d2 100644
--- a/daemons/runsystem.sh
+++ b/daemons/runsystem.sh
@@ -114,10 +114,6 @@ case "$flags" in
;;
esac
-# Start the default pager. It will bail if there is already one running.
-echo Starting default pager
-/hurd/mach-defpager
-
# This is necessary to make stat / return the correct device ids.
fsysopts / --update --readonly
diff --git a/sutils/swapon.c b/sutils/swapon.c
index 2bda8be5..b699b933 100644
--- a/sutils/swapon.c
+++ b/sutils/swapon.c
@@ -88,7 +88,7 @@ static char *doc =
static mach_port_t def_pager = MACH_PORT_NULL;
static mach_port_t dev_master = MACH_PORT_NULL;
-static void get_def_pager(void)
+static void get_def_pager(int autostart)
{
int err;
mach_port_t host;
@@ -114,7 +114,25 @@ static void get_def_pager(void)
if (err)
error (13, err, "Cannot get default pager port");
if (def_pager == MACH_PORT_NULL)
- error (14, 0, "No default pager (memory manager) is running!");
+ {
+ error (autostart ? 0 : 14, 0,
+ "No default pager (memory manager) is running");
+ if (autostart)
+ {
+ /* Try to auto-start it. */
+ err = system ("/hurd/mach-defpager");
+ if (err)
+ error (15, err, "Could not start it");
+ else
+ {
+ fprintf (stderr, "Started it\n");
+ err = vm_set_default_memory_manager (host, &def_pager);
+ mach_port_deallocate (mach_task_self (), host);
+ if (err)
+ error (16, err, "Cannot get default pager port");
+ }
+ }
+ }
}
}
@@ -400,7 +418,7 @@ swaponoff (const char *file, int add, int skipnotexisting)
return EINVAL;
}
- get_def_pager();
+ get_def_pager (add);
recnum_t runs[store->num_runs * 2];
size_t i, j;
@@ -534,7 +552,7 @@ main (int argc, char *argv[])
size_t i;
int err;
- get_def_pager();
+ get_def_pager (0);
err = default_pager_storage_info (def_pager, &size, &nsize, &free, &nfree,
&names, &names_len);