svn commit: r184602 - head/lib/libc/stdlib

Jason Evans jasone at FreeBSD.org
Mon Nov 3 13:17:18 PST 2008


Author: jasone
Date: Mon Nov  3 21:17:18 2008
New Revision: 184602
URL: http://svn.freebsd.org/changeset/base/184602

Log:
  Revert to preferring mmap(2) over sbrk(2) when mapping memory, due to
  potential extreme contention in the kernel for multi-threaded applications
  on SMP systems.
  
  Reported by:	kris

Modified:
  head/lib/libc/stdlib/malloc.3
  head/lib/libc/stdlib/malloc.c

Modified: head/lib/libc/stdlib/malloc.3
==============================================================================
--- head/lib/libc/stdlib/malloc.3	Mon Nov  3 21:17:02 2008	(r184601)
+++ head/lib/libc/stdlib/malloc.3	Mon Nov  3 21:17:18 2008	(r184602)
@@ -255,7 +255,7 @@ If both the
 .Dq D
 and
 .Dq M
-options are enabled, the allocator prefers the DSS over anonymous mappings,
+options are enabled, the allocator prefers anonymous mappings over the DSS,
 but allocation only fails if memory cannot be acquired via either method.
 If neither option is enabled, then the
 .Dq M

Modified: head/lib/libc/stdlib/malloc.c
==============================================================================
--- head/lib/libc/stdlib/malloc.c	Mon Nov  3 21:17:02 2008	(r184601)
+++ head/lib/libc/stdlib/malloc.c	Mon Nov  3 21:17:18 2008	(r184602)
@@ -1536,11 +1536,6 @@ base_pages_alloc(size_t minsize)
 {
 
 #ifdef MALLOC_DSS
-	if (opt_dss) {
-		if (base_pages_alloc_dss(minsize) == false)
-			return (false);
-	}
-
 	if (opt_mmap && minsize != 0)
 #endif
 	{
@@ -1548,6 +1543,14 @@ base_pages_alloc(size_t minsize)
 			return (false);
 	}
 
+#ifdef MALLOC_DSS
+	if (opt_dss) {
+		if (base_pages_alloc_dss(minsize) == false)
+			return (false);
+	}
+
+#endif
+
 	return (true);
 }
 
@@ -1984,6 +1987,15 @@ chunk_alloc(size_t size, bool zero)
 	assert((size & chunksize_mask) == 0);
 
 #ifdef MALLOC_DSS
+	if (opt_mmap)
+#endif
+	{
+		ret = chunk_alloc_mmap(size);
+		if (ret != NULL)
+			goto RETURN;
+	}
+
+#ifdef MALLOC_DSS
 	if (opt_dss) {
 		ret = chunk_recycle_dss(size, zero);
 		if (ret != NULL) {
@@ -1994,14 +2006,7 @@ chunk_alloc(size_t size, bool zero)
 		if (ret != NULL)
 			goto RETURN;
 	}
-
-	if (opt_mmap)
 #endif
-	{
-		ret = chunk_alloc_mmap(size);
-		if (ret != NULL)
-			goto RETURN;
-	}
 
 	/* All strategies for allocation failed. */
 	ret = NULL;


More information about the svn-src-all mailing list