From 03bf5b67be92db3a49f81816dccb5c18c0f2a0c0 Mon Sep 17 00:00:00 2001 From: Jason Evans Date: Wed, 12 Aug 2015 10:26:54 -0700 Subject: [PATCH] Try to decommit new chunks. Always leave decommit disabled on non-Windows systems. --- src/chunk_dss.c | 3 ++- src/chunk_mmap.c | 6 ++++-- src/pages.c | 8 +++++++- test/integration/chunk.c | 25 ++++++++++++++----------- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/chunk_dss.c b/src/chunk_dss.c index 1035581445..de0546d002 100644 --- a/src/chunk_dss.c +++ b/src/chunk_dss.c @@ -145,7 +145,8 @@ chunk_alloc_dss(arena_t *arena, void *new_addr, size_t size, size_t alignment, ret, size); memset(ret, 0, size); } - *commit = true; + if (!*commit) + *commit = pages_decommit(ret, size); return (ret); } } while (dss_prev != (void *)-1); diff --git a/src/chunk_mmap.c b/src/chunk_mmap.c index a91a14c7e7..36eb07548f 100644 --- a/src/chunk_mmap.c +++ b/src/chunk_mmap.c @@ -24,7 +24,8 @@ chunk_alloc_mmap_slow(size_t size, size_t alignment, bool *zero, bool *commit) assert(ret != NULL); *zero = true; - *commit = true; + if (!*commit) + *commit = pages_decommit(ret, size); return (ret); } @@ -61,7 +62,8 @@ chunk_alloc_mmap(size_t size, size_t alignment, bool *zero, bool *commit) assert(ret != NULL); *zero = true; - *commit = true; + if (!*commit) + *commit = pages_decommit(ret, size); return (ret); } diff --git a/src/pages.c b/src/pages.c index 6f775dc235..83a167f670 100644 --- a/src/pages.c +++ b/src/pages.c @@ -102,7 +102,13 @@ pages_commit_impl(void *addr, size_t size, bool commit) { #ifndef _WIN32 - if (config_debug) { + /* + * The following decommit/commit implementation is functional, but + * always disabled because it doesn't add value beyong improved + * debugging (at the cost of extra system calls) on systems that + * overcommit. + */ + if (false) { int prot = commit ? (PROT_READ | PROT_WRITE) : PROT_NONE; void *result = mmap(addr, size, prot, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0); diff --git a/test/integration/chunk.c b/test/integration/chunk.c index b49afa5f65..8679f7b5cc 100644 --- a/test/integration/chunk.c +++ b/test/integration/chunk.c @@ -49,25 +49,30 @@ bool chunk_commit(void *chunk, size_t size, size_t offset, size_t length, unsigned arena_ind) { + bool err; TRACE_HOOK("%s(chunk=%p, size=%zu, offset=%zu, length=%zu, " "arena_ind=%u)\n", __func__, chunk, size, offset, length, arena_ind); - did_commit = true; - memset((void *)((uintptr_t)chunk + offset), 0, length); - return (false); + err = old_hooks.commit(chunk, size, offset, length, arena_ind); + did_commit = !err; + return (err); } bool chunk_decommit(void *chunk, size_t size, size_t offset, size_t length, unsigned arena_ind) { + bool err; TRACE_HOOK("%s(chunk=%p, size=%zu, offset=%zu, length=%zu, " "arena_ind=%u)\n", __func__, chunk, size, offset, length, arena_ind); - did_decommit = true; - return (!do_decommit); + if (!do_decommit) + return (true); + err = old_hooks.decommit(chunk, size, offset, length, arena_ind); + did_decommit = !err; + return (err); } bool @@ -167,7 +172,7 @@ TEST_BEGIN(test_chunk) assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0, "Unexpected arena.0.purge error"); assert_true(did_dalloc, "Expected dalloc"); - assert_true(did_decommit, "Expected decommit"); + assert_false(did_decommit, "Unexpected decommit"); assert_true(did_purge, "Expected purge"); dallocx(p, 0); do_dalloc = true; @@ -185,12 +190,11 @@ TEST_BEGIN(test_chunk) "Unexpected xallocx() failure"); assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0, "Unexpected arena.0.purge error"); - assert_true(did_decommit, "Expected decommit"); assert_true(did_split, "Expected split"); assert_zu_eq(xallocx(p, huge0 * 2, 0, 0), huge0 * 2, "Unexpected xallocx() failure"); - assert_true(did_commit, "Expected commit"); - assert_true(did_commit, "Expected merge"); + assert_b_eq(did_decommit, did_commit, "Expected decommit/commit match"); + assert_true(did_merge, "Expected merge"); dallocx(p, 0); do_dalloc = true; do_decommit = false; @@ -222,11 +226,10 @@ TEST_BEGIN(test_chunk) "Unexpected xallocx() failure"); assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0, "Unexpected arena.0.purge error"); - assert_true(did_decommit, "Expected decommit"); did_commit = false; assert_zu_eq(xallocx(p, large1, 0, 0), large1, "Unexpected xallocx() failure"); - assert_true(did_commit, "Expected commit"); + assert_b_eq(did_decommit, did_commit, "Expected decommit/commit match"); dallocx(p, 0); do_decommit = false;