- 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.
This commit is contained in:
Dag-Erling Smørgrav 2012-08-16 08:29:49 +00:00
parent 52e9cf7de5
commit 3ff863f1aa
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=239327

View File

@ -1804,6 +1804,7 @@ swap_pager_swapoff(struct swdevt *sp)
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 @@ swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk)
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 @@ swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk)
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 @@ sys_swapon(struct thread *td, struct swapon_args *uap)
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);
}