diff options
author | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2018-06-25 14:42:21 +0000 |
---|---|---|
committer | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2018-06-25 16:57:53 +0200 |
commit | a449eb75c6b8137021ca42d49ee3753e36804dc7 (patch) | |
tree | 054307a4a40df8fa16790dbeffb2049d02f3b98f /usr/src | |
parent | ce7b55c99a83499aa24478410ef53728583326de (diff) | |
download | illumos-joyent-a449eb75c6b8137021ca42d49ee3753e36804dc7.tar.gz |
OS-6832 reclaim memory when NOSLEEP bhyve allocation fails
Reviewed by: Mike Gerdts <mike.gerdts@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Approved by: Jerry Jelinek <jerry.jelinek@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c b/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c index d8a44ddf37..11f4c52fd1 100644 --- a/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c +++ b/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c @@ -19,6 +19,7 @@ #include <sys/list.h> #include <sys/mman.h> #include <sys/types.h> +#include <sys/ddi.h> #include <sys/sysmacros.h> #include <sys/machsystm.h> #include <sys/vmsystm.h> @@ -932,6 +933,39 @@ vm_object_pager_sg(vm_object_t vmo, uintptr_t off, pfn_t *lpfn, uint_t *lvl) return (pfn); } +static void +vm_reserve_pages(size_t npages) +{ + uint_t retries = 60; + int rc; + + mutex_enter(&freemem_lock); + if (availrmem < npages) { + mutex_exit(&freemem_lock); + + /* + * Set needfree and wait for the ZFS ARC reap thread to free up + * some memory. + */ + page_needfree(npages); + + mutex_enter(&freemem_lock); + while ((availrmem < npages) && retries-- > 0) { + mutex_exit(&freemem_lock); + rc = delay_sig(drv_usectohz(1 * MICROSEC)); + mutex_enter(&freemem_lock); + + if (rc == EINTR) + break; + } + mutex_exit(&freemem_lock); + + page_needfree(-npages); + } else { + mutex_exit(&freemem_lock); + } +} + vm_object_t vm_object_allocate(objtype_t type, vm_pindex_t psize) { @@ -948,6 +982,8 @@ vm_object_allocate(objtype_t type, vm_pindex_t psize) switch (type) { case OBJT_DEFAULT: { + vm_reserve_pages(psize); + /* XXXJOY: opt-in to larger pages? */ vmo->vmo_data = vmem_alloc(vmm_alloc_arena, size, KM_NOSLEEP); if (vmo->vmo_data == NULL) { |