summaryrefslogtreecommitdiffstats
path: root/sys/vm/swap_pager.h
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2003-08-03 13:35:31 +0000
committerphk <phk@FreeBSD.org>2003-08-03 13:35:31 +0000
commitb51aac6e92301d565ae8caf3ed79b43ceb2c83b9 (patch)
treef4886810e2ad3d0f5882e032243795cc3df6b2da /sys/vm/swap_pager.h
parent421c0ba53ed5056863ab596f64a775d1a2d2d966 (diff)
downloadFreeBSD-src-b51aac6e92301d565ae8caf3ed79b43ceb2c83b9.zip
FreeBSD-src-b51aac6e92301d565ae8caf3ed79b43ceb2c83b9.tar.gz
Change the layout policy of the swap_pager from a hardcoded width
striping to a per device round-robin algorithm. Because of the policy of not attempting to retain previous swap allocation on page-out, this means that a newly added swap device almost instantly takes its 1/N share of the I/O load but it takes somewhat longer for it to assume it's 1/N share of the pages if there is plenty of space on the other devices. Change the 8G total swapspace limitation to 8G per device instead by using a per device blist rather than one global blist. This reduces the memory footprint by 75% (typically a couple hundred kilobytes) for the common case with one swapdevice but NSWAPDEV=4. Remove the compile time constant limit of number of swap devices, there is no limit now. Instead of a fixed size array, store the per swapdev structure in a TAILQ. Total swap space is still addressed by a 32 bit page number and therefore the upper limit is now 2^42 bytes = 16TB (for i386). We still do not allocate the first page of each device in order to give some amount of protection to any bsdlabel at the start of the device. A new device is appended after the existing devices in the swap space, no attempt is made to fill in holes left behind by swapoff (this can trivially be changed should it ever become a problem). The sysctl vm.nswapdev now reflects the number of currently configured swap devices. Rename vm_swap_size to swap_pager_avail for consistency with other exported names. Change argument type for vm_proc_swapin_all() and swap_pager_isswapped() to be a struct swdevt pointer rather than an index. Not changed: we are still using blists to manage the free space, but since the swapspace is no longer fragmented by the striping different resource managers might fare better.
Diffstat (limited to 'sys/vm/swap_pager.h')
-rw-r--r--sys/vm/swap_pager.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/vm/swap_pager.h b/sys/vm/swap_pager.h
index d2d63ae..33c409d 100644
--- a/sys/vm/swap_pager.h
+++ b/sys/vm/swap_pager.h
@@ -50,13 +50,14 @@
#ifdef _KERNEL
extern int swap_pager_full;
-extern int vm_swap_size;
+extern int swap_pager_avail;
+struct swdevt;
void swap_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *);
void swap_pager_copy(vm_object_t, vm_object_t, vm_pindex_t, int);
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_isswapped(vm_object_t, struct swdevt *);
int swap_pager_reserve(vm_object_t, vm_pindex_t, vm_size_t);
void swap_pager_status(int *total, int *used);
OpenPOWER on IntegriCloud