Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Aug 2012 08:29:49 +0000 (UTC)
From:      Dag-Erling Smørgrav <des@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r239327 - head/sys/vm
Message-ID:  <201208160829.q7G8TnRl084388@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: des
Date: Thu Aug 16 08:29:49 2012
New Revision: 239327
URL: http://svn.freebsd.org/changeset/base/239327

Log:
  - 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.

Modified:
  head/sys/vm/swap_pager.c

Modified: head/sys/vm/swap_pager.c
==============================================================================
--- head/sys/vm/swap_pager.c	Thu Aug 16 07:43:15 2012	(r239326)
+++ head/sys/vm/swap_pager.c	Thu Aug 16 08:29:49 2012	(r239327)
@@ -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 *
 	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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208160829.q7G8TnRl084388>