summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorHans Rosenfeld <hans.rosenfeld@joyent.com>2018-06-25 14:42:21 +0000
committerHans Rosenfeld <hans.rosenfeld@joyent.com>2018-06-25 16:57:53 +0200
commita449eb75c6b8137021ca42d49ee3753e36804dc7 (patch)
tree054307a4a40df8fa16790dbeffb2049d02f3b98f /usr/src
parentce7b55c99a83499aa24478410ef53728583326de (diff)
downloadillumos-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.c36
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) {