summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authorjasone <jasone@FreeBSD.org>2008-11-03 21:17:18 +0000
committerjasone <jasone@FreeBSD.org>2008-11-03 21:17:18 +0000
commit9df0eb1bf3abcd3baad30f9593ec04993fd8056d (patch)
tree3003ac9eb634a37623e6d93b4ab3f2d2d6cc424c /lib/libc
parent9757361d220b602cdbb092515812a7b76957eb26 (diff)
downloadFreeBSD-src-9df0eb1bf3abcd3baad30f9593ec04993fd8056d.zip
FreeBSD-src-9df0eb1bf3abcd3baad30f9593ec04993fd8056d.tar.gz
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
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/stdlib/malloc.32
-rw-r--r--lib/libc/stdlib/malloc.c29
2 files changed, 18 insertions, 13 deletions
diff --git a/lib/libc/stdlib/malloc.3 b/lib/libc/stdlib/malloc.3
index 994038d..a621a24 100644
--- a/lib/libc/stdlib/malloc.3
+++ b/lib/libc/stdlib/malloc.3
@@ -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
diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c
index 00b169f..55bc413 100644
--- a/lib/libc/stdlib/malloc.c
+++ b/lib/libc/stdlib/malloc.c
@@ -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;
OpenPOWER on IntegriCloud