diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-03-16 01:48:40 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-03-16 01:48:40 +0100 |
commit | 4f51b0e104481fb6d337140eeaa51af8c674d236 (patch) | |
tree | 452aacaf7f586e2ccd22bda15a92419d9616065b /procfs/rootdir.c | |
parent | 0bc52ecb504401e089e1aa335c56e0c5db6d8e32 (diff) | |
download | hurd-4f51b0e104481fb6d337140eeaa51af8c674d236.tar.gz hurd-4f51b0e104481fb6d337140eeaa51af8c674d236.tar.bz2 hurd-4f51b0e104481fb6d337140eeaa51af8c674d236.zip |
Add getting swap information from swapon and procfs
* hurd/default_pager.defs (default_pager_storage_info): New RPC.
* hurd/default_pager_reply.defs: Skip default_pager_storage_info RPC.
* hurd/default_pager_types.h: Include <mach/machine/vm_types.h>.
(vm_size_array_t): New type.
* mach-defpager/priv.h (part): Add `name' field.
* mach-defpager/default_pager.c (new_partition): Allocate and fill
`part->name' field. Free it on error.
(destroy_paging_partition): Free `part->name' field.
(S_default_pager_storage_info): New function.
* procfs/Makefile (SRCS): Add default_pagerUser.c.
* procfs/rootdir.c: Include "default_pager_U.h".
(rootdir_gc_swaps): New function.
(rootdir_entries): Add "swaps" entry.
* sutils/swapon.c: Include <argz.h>
(show): New variable.
(options): Add --show/-S option.
(def_pager, dev_master): New variables
(swaponoff): Move getting `def_pager' to...
(get_def_pager): ... new function.
(main): Support 'S' option.
* trans/proxy-defpager.c (S_default_pager_storage_info): New function.
Diffstat (limited to 'procfs/rootdir.c')
-rw-r--r-- | procfs/rootdir.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/procfs/rootdir.c b/procfs/rootdir.c index 93fef8d9..dd693c89 100644 --- a/procfs/rootdir.c +++ b/procfs/rootdir.c @@ -21,6 +21,7 @@ #include <mach/vm_param.h> #include <mach/vm_statistics.h> #include <mach/vm_cache_statistics.h> +#include "default_pager_U.h" #include <mach/default_pager.h> #include <mach_debug/mach_debug_types.h> #include <hurd/paths.h> @@ -521,6 +522,56 @@ rootdir_gc_filesystems (void *hook, char **contents, ssize_t *contents_len) fclose (m); return err; } + +static error_t +rootdir_gc_swaps (void *hook, char **contents, ssize_t *contents_len) +{ + mach_port_t defpager; + error_t err = 0; + FILE *m; + vm_size_t *free = NULL; + size_t nfree = 0; + vm_size_t *size = NULL; + size_t nsize = 0; + char *names = NULL, *name; + size_t names_len = 0; + size_t i; + + m = open_memstream (contents, (size_t *) contents_len); + if (m == NULL) + return errno; + + defpager = file_name_lookup (_SERVERS_DEFPAGER, O_READ, 0); + if (defpager == MACH_PORT_NULL) + { + err = errno; + goto out_fclose; + } + + err = default_pager_storage_info (defpager, &free, &nfree, &size, &nsize, + &names, &names_len); + if (err) + goto out; + + fprintf(m, "Filename\tType\t\tSize\tUsed\tPriority\n"); + name = names; + for (i = 0; i < nfree; i++) + { + fprintf (m, "/dev/%s\tpartition\t%zu\t%zu\t-1\n", + name, size[i] >> 10, (size[i] - free[i]) >> 10); + name = argz_next (names, names_len, name); + } + + vm_deallocate (mach_task_self(), (vm_offset_t) free, nfree * sizeof(*free)); + vm_deallocate (mach_task_self(), (vm_offset_t) size, nsize * sizeof(*size)); + vm_deallocate (mach_task_self(), (vm_offset_t) names, names_len); + +out: + mach_port_deallocate (mach_task_self (), defpager); +out_fclose: + fclose (m); + return err; +} /* Glue logic and entries table */ @@ -703,6 +754,13 @@ static const struct procfs_dir_entry rootdir_entries[] = { .cleanup_contents = procfs_cleanup_contents_with_free, }, }, + { + .name = "swaps", + .hook = & (struct procfs_node_ops) { + .get_contents = rootdir_gc_swaps, + .cleanup_contents = procfs_cleanup_contents_with_free, + }, + }, #ifdef PROFILE /* In order to get a usable gmon.out file, we must apparently use exit(). */ { |