svn commit: r270861 - in head/sys/cddl: compat/opensolaris/kern compat/opensolaris/sys contrib/opensolaris/uts/common/fs/zfs

Steven Hartland smh at FreeBSD.org
Sat Aug 30 21:44:33 UTC 2014


Author: smh
Date: Sat Aug 30 21:44:32 2014
New Revision: 270861
URL: http://svnweb.freebsd.org/changeset/base/270861

Log:
  Ensure that ZFS ARC free memory checks include cached pages
  
  Also restore kmem_used() check for i386 as it has KVA limits that the raw
  page counts above don't consider
  
  PR:		187594
  Reviewed by:	peter
  X-MFC-With: r270759
  Review:	D700
  Sponsored by:	Multiplay

Modified:
  head/sys/cddl/compat/opensolaris/kern/opensolaris_kmem.c
  head/sys/cddl/compat/opensolaris/sys/kmem.h
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c

Modified: head/sys/cddl/compat/opensolaris/kern/opensolaris_kmem.c
==============================================================================
--- head/sys/cddl/compat/opensolaris/kern/opensolaris_kmem.c	Sat Aug 30 20:26:30 2014	(r270860)
+++ head/sys/cddl/compat/opensolaris/kern/opensolaris_kmem.c	Sat Aug 30 21:44:32 2014	(r270861)
@@ -152,7 +152,7 @@ u_int
 kmem_free_count(void)
 {
 
-	return (vm_cnt.v_free_count);
+	return (vm_cnt.v_free_count + vm_cnt.v_cache_count);
 }
 
 u_int
@@ -169,6 +169,13 @@ kmem_size(void)
 	return (kmem_size_val);
 }
 
+uint64_t
+kmem_used(void)
+{
+
+	return (vmem_size(kmem_arena, VMEM_ALLOC));
+}
+
 static int
 kmem_std_constructor(void *mem, int size __unused, void *private, int flags)
 {

Modified: head/sys/cddl/compat/opensolaris/sys/kmem.h
==============================================================================
--- head/sys/cddl/compat/opensolaris/sys/kmem.h	Sat Aug 30 20:26:30 2014	(r270860)
+++ head/sys/cddl/compat/opensolaris/sys/kmem.h	Sat Aug 30 21:44:32 2014	(r270861)
@@ -66,6 +66,7 @@ typedef struct kmem_cache {
 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);
 u_int kmem_page_count(void);
 
 /*

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Sat Aug 30 20:26:30 2014	(r270860)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Sat Aug 30 21:44:32 2014	(r270861)
@@ -2563,6 +2563,14 @@ arc_reclaim_needed(void)
 #endif	/* sun */
 
 #else
+#ifdef __i386__
+	/* i386 has KVA limits that the raw page counts above don't consider */
+	if (kmem_used() > (kmem_size() * 3) / 4) {
+		DTRACE_PROBE2(arc__reclaim_used, uint64_t,
+		    kmem_used(), uint64_t, (kmem_size() * 3) / 4);
+		return (1);
+	}
+#endif
 	if (spa_get_random(100) == 0)
 		return (1);
 #endif


More information about the svn-src-all mailing list