diff options
author | Alexander Motin <mav@FreeBSD.org> | 2015-04-03 14:45:48 +0000 |
---|---|---|
committer | Alexander Motin <mav@FreeBSD.org> | 2015-04-03 14:45:48 +0000 |
commit | 2e9ccb32a1641da8dc99d90cfd8275c27c2fa906 (patch) | |
tree | b7f8a97c288f434a2d4a88b5e6e78891583f5036 | |
parent | 7ab169a322d435d2e83e3200686472b4533ddf79 (diff) |
Notes
-rw-r--r-- | sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c | 14 | ||||
-rw-r--r-- | sys/kern/subr_vmem.c | 9 | ||||
-rw-r--r-- | sys/sys/vmem.h | 1 |
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 */ |