[libc-commits] [libc] [libc] Add a config option to disable slab reclaiming (PR #151599)
Joseph Huber via libc-commits
libc-commits at lists.llvm.org
Wed Aug 27 05:51:25 PDT 2025
https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/151599
>From 69a6fb048c408bba4fae8f50bf93121bbc2aa314 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Wed, 30 Jul 2025 11:32:35 -0500
Subject: [PATCH] [libc] Add a config option to disable slab reclaiming
Summary:
Without slab reclaiming this interface is much simpler and it can speed
up cases with a lot of churn. Basically, wastes memory for performance.
---
libc/src/__support/GPU/allocator.cpp | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/libc/src/__support/GPU/allocator.cpp b/libc/src/__support/GPU/allocator.cpp
index 3da339c63ccd0..813a2a48331cb 100644
--- a/libc/src/__support/GPU/allocator.cpp
+++ b/libc/src/__support/GPU/allocator.cpp
@@ -43,6 +43,9 @@ constexpr static uint32_t MAX_TRIES = 1024;
// The number of previously allocated slabs we will keep in memory.
constexpr static uint32_t CACHED_SLABS = 8;
+// Configuration for whether or not we will return unused slabs to memory.
+constexpr static bool RECLAIM = true;
+
static_assert(!(ARRAY_SIZE & (ARRAY_SIZE - 1)), "Must be a power of two");
namespace impl {
@@ -399,7 +402,7 @@ struct GuardPtr {
// and obtain exclusive rights to deconstruct it. If the CAS failed either
// another thread resurrected the counter and we quit, or a parallel read
// helped us invalidating it. For the latter, claim that flag and return.
- if (counter.fetch_sub(n, cpp::MemoryOrder::RELAXED) == n) {
+ if (counter.fetch_sub(n, cpp::MemoryOrder::RELAXED) == n && RECLAIM) {
uint32_t expected = 0;
if (counter.compare_exchange_strong(expected, INVALID,
cpp::MemoryOrder::RELAXED,
@@ -417,8 +420,9 @@ struct GuardPtr {
// thread.
uint64_t read() {
auto val = counter.load(cpp::MemoryOrder::RELAXED);
- if (val == 0 && counter.compare_exchange_strong(
- val, INVALID | HELPED, cpp::MemoryOrder::RELAXED))
+ if (val == 0 && RECLAIM &&
+ counter.compare_exchange_strong(val, INVALID | HELPED,
+ cpp::MemoryOrder::RELAXED))
return 0;
return (val & INVALID) ? 0 : val;
}
@@ -463,7 +467,7 @@ struct GuardPtr {
return nullptr;
cpp::atomic_thread_fence(cpp::MemoryOrder::ACQUIRE);
- return ptr.load(cpp::MemoryOrder::RELAXED);
+ return RECLAIM ? ptr.load(cpp::MemoryOrder::RELAXED) : expected;
}
// Finalize the associated memory and signal that it is ready to use by
More information about the libc-commits
mailing list