Skip to content

Commit 9d75672

Browse files
committed
Implement size limit for the cache of opened IPC handles
1 parent 23cbc0c commit 9d75672

File tree

6 files changed

+227
-107
lines changed

6 files changed

+227
-107
lines changed

src/ipc.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,19 +146,15 @@ umf_result_t umfOpenIPCHandle(umf_ipc_handler_handle_t hIPCHandler,
146146
}
147147

148148
umf_result_t umfCloseIPCHandle(void *ptr) {
149-
umf_alloc_info_t allocInfo;
150-
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
149+
umf_ipc_info_t ipcInfo;
150+
umf_result_t ret = umfMemoryTrackerGetIpcInfo(ptr, &ipcInfo);
151151
if (ret != UMF_RESULT_SUCCESS) {
152-
LOG_ERR("cannot get alloc info for ptr = %p.", ptr);
152+
LOG_ERR("cannot get IPC info for ptr = %p.", ptr);
153153
return ret;
154154
}
155155

156-
// We cannot use umfPoolGetMemoryProvider function because it returns
157-
// upstream provider but we need tracking one
158-
umf_memory_provider_handle_t hProvider = allocInfo.pool->provider;
159-
160-
return umfMemoryProviderCloseIPCHandle(hProvider, allocInfo.base,
161-
allocInfo.baseSize);
156+
return umfMemoryProviderCloseIPCHandle(ipcInfo.provider, ipcInfo.base,
157+
ipcInfo.baseSize);
162158
}
163159

164160
umf_result_t umfPoolGetIPCHandler(umf_memory_pool_handle_t hPool,

src/ipc_cache.c

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,22 @@ typedef struct ipc_opened_cache_t {
5454

5555
ipc_opened_cache_global_t *IPC_OPENED_CACHE_GLOBAL = NULL;
5656

57+
// Returns value of the UMF_MAX_OPENED_IPC_HANDLES environment variable
58+
// or 0 if it is not set.
59+
static size_t umfIpcCacheGlobalInitMaxOpenedHandles(void) {
60+
const char *max_size_str = getenv("UMF_MAX_OPENED_IPC_HANDLES");
61+
if (max_size_str) {
62+
char *endptr;
63+
size_t max_size = strtoul(max_size_str, &endptr, 10);
64+
if (*endptr == '\0') {
65+
return max_size;
66+
}
67+
LOG_ERR("Invalid value of UMF_MAX_OPENED_IPC_HANDLES: %s",
68+
max_size_str);
69+
}
70+
return 0;
71+
}
72+
5773
umf_result_t umfIpcCacheGlobalInit(void) {
5874
umf_result_t ret = UMF_RESULT_SUCCESS;
5975
ipc_opened_cache_global_t *cache_global =
@@ -78,8 +94,7 @@ umf_result_t umfIpcCacheGlobalInit(void) {
7894
goto err_mutex_destroy;
7995
}
8096

81-
// TODO: make max_size configurable via environment variable
82-
cache_global->max_size = 0;
97+
cache_global->max_size = umfIpcCacheGlobalInitMaxOpenedHandles();
8398
cache_global->cur_size = 0;
8499
cache_global->lru_list = NULL;
85100

@@ -191,7 +206,19 @@ umf_result_t umfIpcOpenedCacheGet(ipc_opened_cache_handle_t cache,
191206
if (entry == NULL && cache->global->max_size != 0 &&
192207
cache->global->cur_size >= cache->global->max_size) {
193208
// If max_size is set and the cache is full, evict the least recently used entry.
194-
entry = cache->global->lru_list->prev;
209+
// we need to search for the least recently used entry with ref_count == 0
210+
// The utlist implementation of the doubly-linked list keeps a tail pointer in head->prev
211+
ipc_opened_cache_entry_t *candidate = cache->global->lru_list->prev;
212+
do {
213+
uint64_t ref_count = 0;
214+
utils_atomic_load_acquire_u64(&candidate->ref_count,
215+
&ref_count);
216+
if (ref_count == 0) {
217+
entry = candidate;
218+
break;
219+
}
220+
candidate = candidate->prev;
221+
} while (candidate != cache->global->lru_list->prev);
195222
}
196223

197224
if (entry) { // we have eviction candidate
@@ -244,3 +271,20 @@ umf_result_t umfIpcOpenedCacheGet(ipc_opened_cache_handle_t cache,
244271

245272
return ret;
246273
}
274+
275+
umf_result_t
276+
umfIpcHandleMappedCacheRelease(ipc_opened_cache_value_t *cacheValue) {
277+
if (!cacheValue) {
278+
LOG_ERR("cacheValue is NULL");
279+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
280+
}
281+
282+
// get pointer to the entry
283+
ipc_opened_cache_entry_t *entry =
284+
(ipc_opened_cache_entry_t *)((char *)cacheValue -
285+
offsetof(ipc_opened_cache_entry_t, value));
286+
// decrement the ref count
287+
utils_atomic_decrement_u64(&entry->ref_count);
288+
289+
return UMF_RESULT_SUCCESS;
290+
}

src/ipc_cache.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,6 @@ umf_result_t umfIpcOpenedCacheGet(ipc_opened_cache_handle_t cache,
4747
uint64_t handle_id,
4848
ipc_opened_cache_value_t **retEntry);
4949

50+
umf_result_t
51+
umfIpcHandleMappedCacheRelease(ipc_opened_cache_value_t *cacheValue);
5052
#endif /* UMF_IPC_CACHE_H */

0 commit comments

Comments
 (0)