summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2012-08-16 08:29:49 +0000
committerdes <des@FreeBSD.org>2012-08-16 08:29:49 +0000
commit5e886491665c7f13c1b16930902495e41548b2ca (patch)
tree53fd447e4bbcc5e46482e917eaf09a86bdaf389d /sys/vm
parent5d064f6d9a699ad8cabb71409c6f531d81745ab3 (diff)
downloadFreeBSD-src-5e886491665c7f13c1b16930902495e41548b2ca.zip
FreeBSD-src-5e886491665c7f13c1b16930902495e41548b2ca.tar.gz
- When running out of swzone, instead of spewing an error message every
tick until the situation is resolved (if ever), just print a single message when running out and another when space becomes available. - When adding more swap, warn if the total amount exceeds half the theoretical maximum we can handle.
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/swap_pager.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 3c902e3..a7d784a 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -1804,6 +1804,7 @@ restart:
static void
swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk)
{
+ static volatile int exhausted;
struct swblock *swap;
struct swblock **pswap;
int idx;
@@ -1847,7 +1848,9 @@ retry:
mtx_unlock(&swhash_mtx);
VM_OBJECT_UNLOCK(object);
if (uma_zone_exhausted(swap_zone)) {
- printf("swap zone exhausted, increase kern.maxswzone\n");
+ if (atomic_cmpset_rel_int(&exhausted, 0, 1))
+ printf("swap zone exhausted, "
+ "increase kern.maxswzone\n");
vm_pageout_oom(VM_OOM_SWAPZ);
pause("swzonex", 10);
} else
@@ -1856,6 +1859,9 @@ retry:
goto retry;
}
+ if (atomic_cmpset_rel_int(&exhausted, 1, 0))
+ printf("swap zone ok\n");
+
swap->swb_hnext = NULL;
swap->swb_object = object;
swap->swb_index = pindex & ~(vm_pindex_t)SWAP_META_MASK;
@@ -2112,6 +2118,31 @@ done:
return (error);
}
+/*
+ * Check that the total amount of swap currently configured does not
+ * exceed half the theoretical maximum. If it does, print a warning
+ * message and return -1; otherwise, return 0.
+ */
+static int
+swapon_check_swzone(unsigned long npages)
+{
+ unsigned long maxpages;
+
+ /* absolute maximum we can handle assuming 100% efficiency */
+ maxpages = uma_zone_get_max(swap_zone) * SWAP_META_PAGES;
+
+ /* recommend using no more than half that amount */
+ if (npages > maxpages / 2) {
+ printf("warning: total configured swap (%lu pages) "
+ "exceeds maximum recommended amount (%lu pages).\n",
+ npages, maxpages);
+ printf("warning: increase kern.maxswzone "
+ "or reduce amount of swap.\n");
+ return (-1);
+ }
+ return (0);
+}
+
static void
swaponsomething(struct vnode *vp, void *id, u_long nblks, sw_strategy_t *strategy, sw_close_t *close, dev_t dev)
{
@@ -2175,6 +2206,7 @@ swaponsomething(struct vnode *vp, void *id, u_long nblks, sw_strategy_t *strateg
nswapdev++;
swap_pager_avail += nblks;
swap_total += (vm_ooffset_t)nblks * PAGE_SIZE;
+ swapon_check_swzone(swap_total / PAGE_SIZE);
swp_sizecheck();
mtx_unlock(&sw_dev_mtx);
}
OpenPOWER on IntegriCloud