summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2003-07-18 10:26:09 +0000
committerphk <phk@FreeBSD.org>2003-07-18 10:26:09 +0000
commit5fa40a32657fa0c3bd8a986099bb65516d11e97b (patch)
treef65e135aef6b67bb4e1d27be159856b438db243f
parent84f9cb2fa862e169a92c4dc14584dda3a33c2a89 (diff)
downloadFreeBSD-src-5fa40a32657fa0c3bd8a986099bb65516d11e97b.zip
FreeBSD-src-5fa40a32657fa0c3bd8a986099bb65516d11e97b.tar.gz
Add a new function swap_pager_status() which reports the total size of the
paging space and how much of it is in use (in pages). Use this interface from the Linuxolator instead of groping around in the internals of the swap_pager.
-rw-r--r--sys/compat/linprocfs/linprocfs.c13
-rw-r--r--sys/compat/linux/linux_misc.c12
-rw-r--r--sys/vm/swap_pager.c18
-rw-r--r--sys/vm/swap_pager.h2
4 files changed, 27 insertions, 18 deletions
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index fe789be..da3530b 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -121,6 +121,7 @@ linprocfs_domeminfo(PFS_FILL_ARGS)
unsigned long long swapused; /* used swap space in bytes */
unsigned long long swapfree; /* free swap space in bytes */
vm_object_t object;
+ int i, j;
memtotal = physmem * PAGE_SIZE;
/*
@@ -135,14 +136,10 @@ linprocfs_domeminfo(PFS_FILL_ARGS)
*/
memused = cnt.v_wire_count * PAGE_SIZE;
memfree = memtotal - memused;
- if (swapblist == NULL) {
- swaptotal = 0;
- swapfree = 0;
- } else {
- swaptotal = (u_quad_t)swapblist->bl_blocks * 1024; /* XXX why 1024? */
- swapfree = (u_quad_t)swapblist->bl_root->u.bmu_avail * PAGE_SIZE;
- }
- swapused = swaptotal - swapfree;
+ swap_pager_status(&i, &j);
+ swaptotal = i * PAGE_SIZE;
+ swapused = j * PAGE_SIZE;
+ swapfree = swaptotal - swapused;
memshared = 0;
TAILQ_FOREACH(object, &vm_object_list, object_list)
if (object->shadow_count > 1)
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index cf113ea..8ccc5cf 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -108,7 +108,7 @@ linux_sysinfo(struct thread *td, struct linux_sysinfo_args *args)
{
struct l_sysinfo sysinfo;
vm_object_t object;
- int i;
+ int i, j;
struct timespec ts;
/* Uptime is copied out of print_uptime() in kern_shutdown.c */
@@ -144,13 +144,9 @@ linux_sysinfo(struct thread *td, struct linux_sysinfo_args *args)
sysinfo.sharedram *= PAGE_SIZE;
sysinfo.bufferram = 0;
- if (swapblist == NULL) {
- sysinfo.totalswap= 0;
- sysinfo.freeswap = 0;
- } else {
- sysinfo.totalswap = swapblist->bl_blocks * 1024;
- sysinfo.freeswap = swapblist->bl_root->u.bmu_avail * PAGE_SIZE;
- }
+ swap_pager_status(&i, &j);
+ sysinfo.totalswap= i * PAGE_SIZE;
+ sysinfo.freeswap = (i - j) * PAGE_SIZE;
sysinfo.procs = 20; /* Hack */
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index faf9075..38806a1 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -142,7 +142,7 @@ static int nsw_wcount_async; /* limit write buffers / asynchronous */
static int nsw_wcount_async_max;/* assigned maximum */
static int nsw_cluster_max; /* maximum VOP I/O allowed */
-struct blist *swapblist;
+static struct blist *swapblist;
static struct swblock **swhash;
static int swhash_mask;
static int swap_async_max = 4; /* maximum in-progress async I/O's */
@@ -2666,6 +2666,22 @@ done2:
return (error);
}
+void
+swap_pager_status(int *total, int *used)
+{
+ struct swdevt *sp;
+ int i;
+
+ *total = 0;
+ *used = 0;
+ for (sp = swdevt, i = 0; i < nswdev; i++, sp++) {
+ if (sp->sw_vp == NULL)
+ continue;
+ *total += sp->sw_nblks;
+ *used += sp->sw_used;
+ }
+}
+
static int
sysctl_vm_swap_info(SYSCTL_HANDLER_ARGS)
{
diff --git a/sys/vm/swap_pager.h b/sys/vm/swap_pager.h
index 4d965a1..34d5bb1 100644
--- a/sys/vm/swap_pager.h
+++ b/sys/vm/swap_pager.h
@@ -93,7 +93,6 @@ struct swdevt {
#define SWAP_META_MASK (SWAP_META_PAGES - 1)
extern int swap_pager_full;
-extern struct blist *swapblist;
extern int vm_swap_size;
void swap_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *);
@@ -102,6 +101,7 @@ void swap_pager_freespace(vm_object_t, vm_pindex_t, vm_size_t);
void swap_pager_swap_init(void);
int swap_pager_isswapped(vm_object_t, int);
int swap_pager_reserve(vm_object_t, vm_pindex_t, vm_size_t);
+void swap_pager_status(int *total, int *used);
#endif /* _KERNEL */
#endif /* _VM_SWAP_PAGER_H_ */
OpenPOWER on IntegriCloud