diff options
author | Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> | 2024-04-29 20:07:46 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-29 20:07:46 +0000 |
commit | cdbc7c75f5667c9845bfcda51c44779ab0d69670 (patch) | |
tree | 490de0b3ee9fa772978d8e2d466a3a0b9381045c | |
parent | e7efd77d2c590bf27fcb2b413421d514dc48f656 (diff) | |
parent | 6abb406e0a8f9a318af055fe8eed377645cc0a51 (diff) | |
download | bionic-cdbc7c75f5667c9845bfcda51c44779ab0d69670.tar.gz |
Merge "[scudo] -1 is also valid for M_DECAY_TIME" into main
-rw-r--r-- | libc/bionic/jemalloc_wrapper.cpp | 8 | ||||
-rw-r--r-- | libc/bionic/malloc_common.cpp | 2 | ||||
-rw-r--r-- | libc/include/malloc.h | 6 | ||||
-rw-r--r-- | tests/malloc_test.cpp | 8 |
4 files changed, 19 insertions, 5 deletions
diff --git a/libc/bionic/jemalloc_wrapper.cpp b/libc/bionic/jemalloc_wrapper.cpp index a2bb1dbb4..1bbdb296c 100644 --- a/libc/bionic/jemalloc_wrapper.cpp +++ b/libc/bionic/jemalloc_wrapper.cpp @@ -77,9 +77,13 @@ void* je_aligned_alloc_wrapper(size_t alignment, size_t size) { int je_mallopt(int param, int value) { // The only parameter we currently understand is M_DECAY_TIME. if (param == M_DECAY_TIME) { - // Only support setting the value to 1 or 0. + // Only support setting the value to -1 or 0 or 1. ssize_t decay_time_ms; - if (value) { + if (value < 0) { + // Given that SSIZE_MAX may not be supported in jemalloc, set this to a + // sufficiently large number that essentially disables the decay timer. + decay_time_ms = 10000000; + } else if (value) { decay_time_ms = 1000; } else { decay_time_ms = 0; diff --git a/libc/bionic/malloc_common.cpp b/libc/bionic/malloc_common.cpp index 9932e3e53..596a1fc82 100644 --- a/libc/bionic/malloc_common.cpp +++ b/libc/bionic/malloc_common.cpp @@ -123,7 +123,7 @@ extern "C" int mallopt(int param, int value) { // Track the M_DECAY_TIME mallopt calls. if (param == M_DECAY_TIME && retval == 1) { __libc_globals.mutate([value](libc_globals* globals) { - if (value == 0) { + if (value <= 0) { atomic_store(&globals->decay_time_enabled, false); } else { atomic_store(&globals->decay_time_enabled, true); diff --git a/libc/include/malloc.h b/libc/include/malloc.h index d22b85ce5..ef1e27d5f 100644 --- a/libc/include/malloc.h +++ b/libc/include/malloc.h @@ -186,7 +186,11 @@ struct mallinfo2 mallinfo2(void) __RENAME(mallinfo); int malloc_info(int __must_be_zero, FILE* _Nonnull __fp) __INTRODUCED_IN(23); /** - * mallopt() option to set the decay time. Valid values are 0 and 1. + * mallopt() option to set the decay time. Valid values are -1, 0 and 1. + * -1 : Disable the releasing of unused pages. This value is available since + * API level 35. + * 0 : Release the unused pages immediately. + * 1 : Release the unused pages at a device-specific interval. * * Available since API level 27. */ diff --git a/tests/malloc_test.cpp b/tests/malloc_test.cpp index 2b48d852b..bd17b82fa 100644 --- a/tests/malloc_test.cpp +++ b/tests/malloc_test.cpp @@ -678,10 +678,12 @@ TEST(malloc, mallopt_smoke) { TEST(malloc, mallopt_decay) { #if defined(__BIONIC__) SKIP_WITH_HWASAN << "hwasan does not implement mallopt"; + ASSERT_EQ(1, mallopt(M_DECAY_TIME, -1)); ASSERT_EQ(1, mallopt(M_DECAY_TIME, 1)); ASSERT_EQ(1, mallopt(M_DECAY_TIME, 0)); ASSERT_EQ(1, mallopt(M_DECAY_TIME, 1)); ASSERT_EQ(1, mallopt(M_DECAY_TIME, 0)); + ASSERT_EQ(1, mallopt(M_DECAY_TIME, -1)); #else GTEST_SKIP() << "bionic-only test"; #endif @@ -1490,7 +1492,7 @@ TEST(malloc, zero_init) { // release secondary allocations back to the OS) was modified to 0ms/1ms by // mallopt_decay. Ensure that we delay for at least a second before releasing // pages to the OS in order to avoid implicit zeroing by the kernel. - mallopt(M_DECAY_TIME, 1000); + mallopt(M_DECAY_TIME, 1); TestHeapZeroing(/* num_iterations */ 32, [](int iteration) -> int { return 1 << (19 + iteration % 4); }); @@ -1764,6 +1766,10 @@ TEST(android_mallopt, get_decay_time_enabled) { EXPECT_EQ(1, mallopt(M_DECAY_TIME, 1)); EXPECT_TRUE(android_mallopt(M_GET_DECAY_TIME_ENABLED, &value, sizeof(value))); EXPECT_TRUE(value); + + EXPECT_EQ(1, mallopt(M_DECAY_TIME, -1)); + EXPECT_TRUE(android_mallopt(M_GET_DECAY_TIME_ENABLED, &value, sizeof(value))); + EXPECT_FALSE(value); #else GTEST_SKIP() << "bionic-only test"; #endif |