Skip to content

Commit

Permalink
- When running out of swzone, instead of spewing an error message every
Browse files Browse the repository at this point in the history
  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.
  • Loading branch information
dag-erling committed Aug 16, 2012
1 parent 5d064f6 commit 5e88649
Showing 1 changed file with 33 additions and 1 deletion.
34 changes: 33 additions & 1 deletion sys/vm/swap_pager.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 5e88649

Please sign in to comment.