Index: sys/cddl/compat/opensolaris/kern/opensolaris_kmem.c =================================================================== --- sys/cddl/compat/opensolaris/kern/opensolaris_kmem.c +++ sys/cddl/compat/opensolaris/kern/opensolaris_kmem.c @@ -170,12 +170,19 @@ } uint64_t -kmem_used(void) +kmem_map_used(void) { return (vmem_size(kmem_arena, VMEM_ALLOC)); } +uint64_t +kmem_map_free(void) +{ + + return (vmem_size(kmem_arena, VMEM_FREE)); +} + static int kmem_std_constructor(void *mem, int size __unused, void *private, int flags) { Index: sys/cddl/compat/opensolaris/sys/kmem.h =================================================================== --- sys/cddl/compat/opensolaris/sys/kmem.h +++ sys/cddl/compat/opensolaris/sys/kmem.h @@ -66,7 +66,8 @@ void *zfs_kmem_alloc(size_t size, int kmflags); void zfs_kmem_free(void *buf, size_t size); uint64_t kmem_size(void); -uint64_t kmem_used(void); +uint64_t kmem_map_used(void); +uint64_t kmem_map_free(void); u_int kmem_page_count(void); /* Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c =================================================================== --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c @@ -2563,7 +2563,7 @@ #else /* sun */ #ifdef __i386__ /* i386 has KVA limits that the raw page counts above don't consider */ - if (kmem_used() > (kmem_size() * 3) / 4) { + if (kmem_map_used() > (kmem_size() * 3) / 4) { DTRACE_PROBE2(arc__reclaim_used, uint64_t, kmem_used(), uint64_t, (kmem_size() * 3) / 4); return (1); @@ -3946,8 +3946,7 @@ arc_memory_throttle(uint64_t reserve, uint64_t txg) { #ifdef _KERNEL - uint64_t available_memory = - ptoa((uintmax_t)vm_cnt.v_free_count + vm_cnt.v_cache_count); + uint64_t available_memory = ptob(kmem_free_count()); static uint64_t page_load = 0; static uint64_t last_txg = 0; @@ -3956,10 +3955,13 @@ available_memory = MIN(available_memory, vmem_size(heap_arena, VMEM_FREE)); #endif +#else /* sun */ +#ifdef __i386__ + available_memory = MIN(available_memory, ptob(kmem_map_free())); +#endif #endif /* sun */ - if (vm_cnt.v_free_count + vm_cnt.v_cache_count > - (uint64_t)physmem * arc_lotsfree_percent / 100) + if (kmem_free_count() > (uint64_t)physmem * arc_lotsfree_percent / 100) return (0); if (txg > last_txg) { @@ -3972,7 +3974,8 @@ * continue to let page writes occur as quickly as possible. */ if (curproc == pageproc) { - if (page_load > available_memory / 4) + if (page_load > MAX(ptob(kmem_free_min()), + available_memory) / 4) return (SET_ERROR(ERESTART)); /* Note: reserve is inflated, so we deflate */ page_load += reserve / 8;