summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2015-04-03 14:45:48 +0000
committerAlexander Motin <mav@FreeBSD.org>2015-04-03 14:45:48 +0000
commit2e9ccb32a1641da8dc99d90cfd8275c27c2fa906 (patch)
treeb7f8a97c288f434a2d4a88b5e6e78891583f5036
parent7ab169a322d435d2e83e3200686472b4533ddf79 (diff)
Notes
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c14
-rw-r--r--sys/kern/subr_vmem.c9
-rw-r--r--sys/sys/vmem.h1
3 files changed, 22 insertions, 2 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
index bc4029b60bc0..4176dcec2239 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
@@ -2648,8 +2648,11 @@ arc_reclaim_needed(void)
(vmem_size(heap_arena, VMEM_FREE | VMEM_ALLOC)) >> 2);
return (1);
}
+#define zio_arena NULL
+#else
+#define zio_arena heap_arena
#endif
-#ifdef illumos
+
/*
* If zio data pages are being allocated out of a separate heap segment,
* then enforce that the size of available vmem for this arena remains
@@ -2663,7 +2666,14 @@ arc_reclaim_needed(void)
vmem_size(zio_arena, VMEM_FREE) <
(vmem_size(zio_arena, VMEM_ALLOC) >> 4))
return (1);
-#endif /* illumos */
+
+ /*
+ * Above limits know nothing about real level of KVA fragmentation.
+ * Start aggressive reclamation if too little sequential KVA left.
+ */
+ if (vmem_size(heap_arena, VMEM_MAXFREE) < zfs_max_recordsize)
+ return (1);
+
#else /* _KERNEL */
if (spa_get_random(100) == 0)
return (1);
diff --git a/sys/kern/subr_vmem.c b/sys/kern/subr_vmem.c
index f88627f5bab1..47e583b25342 100644
--- a/sys/kern/subr_vmem.c
+++ b/sys/kern/subr_vmem.c
@@ -1320,6 +1320,7 @@ vmem_add(vmem_t *vm, vmem_addr_t addr, vmem_size_t size, int flags)
vmem_size_t
vmem_size(vmem_t *vm, int typemask)
{
+ int i;
switch (typemask) {
case VMEM_ALLOC:
@@ -1328,6 +1329,14 @@ vmem_size(vmem_t *vm, int typemask)
return vm->vm_size - vm->vm_inuse;
case VMEM_FREE|VMEM_ALLOC:
return vm->vm_size;
+ case VMEM_MAXFREE:
+ for (i = VMEM_MAXORDER - 1; i >= 0; i--) {
+ if (LIST_EMPTY(&vm->vm_freelist[i]))
+ continue;
+ return ((vmem_size_t)ORDER2SIZE(i) <<
+ vm->vm_quantum_shift);
+ }
+ return (0);
default:
panic("vmem_size");
}
diff --git a/sys/sys/vmem.h b/sys/sys/vmem.h
index 47f55fb97677..f6b960a58518 100644
--- a/sys/sys/vmem.h
+++ b/sys/sys/vmem.h
@@ -129,6 +129,7 @@ void vmem_startup(void);
/* vmem_size typemask */
#define VMEM_ALLOC 0x01
#define VMEM_FREE 0x02
+#define VMEM_MAXFREE 0x10
#endif /* _KERNEL */