Skip to content

Added additional logs to the tracking provider. #524

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/base_alloc/base_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -289,8 +289,7 @@ void umf_ba_destroy(umf_ba_pool_t *pool) {
#ifndef NDEBUG
ba_debug_checks(pool);
if (pool->metadata.n_allocs) {
LOG_ERR("umf_ba_destroy(): pool->metadata.n_allocs = %zu",
pool->metadata.n_allocs);
LOG_ERR("pool->metadata.n_allocs = %zu", pool->metadata.n_allocs);
}
#endif /* NDEBUG */

Expand Down
3 changes: 1 addition & 2 deletions src/base_alloc/base_alloc_linear.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,7 @@ void umf_ba_linear_destroy(umf_ba_linear_pool_t *pool) {
#ifndef NDEBUG
_DEBUG_EXECUTE(ba_debug_checks(pool));
if (pool->metadata.global_n_allocs) {
LOG_ERR("umf_ba_linear_destroy(): global_n_allocs = %zu",
pool->metadata.global_n_allocs);
LOG_ERR("global_n_allocs = %zu", pool->metadata.global_n_allocs);
}
#endif /* NDEBUG */

Expand Down
13 changes: 6 additions & 7 deletions src/ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
umf_alloc_info_t allocInfo;
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("umfGetIPCHandle: cannot get alloc info for ptr = %p.", ptr);
LOG_ERR("cannot get alloc info for ptr = %p.", ptr);
return ret;
}

Expand All @@ -37,22 +37,22 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
size_t providerIPCHandleSize;
ret = umfMemoryProviderGetIPCHandleSize(provider, &providerIPCHandleSize);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("umfGetIPCHandle: cannot get IPC handle size.");
LOG_ERR("cannot get IPC handle size.");
return ret;
}

ipcHandleSize = sizeof(umf_ipc_data_t) + providerIPCHandleSize;
umf_ipc_data_t *ipcData = umf_ba_global_alloc(ipcHandleSize);
if (!ipcData) {
LOG_ERR("umfGetIPCHandle: failed to allocate ipcData");
LOG_ERR("failed to allocate ipcData");
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
}

ret = umfMemoryProviderGetIPCHandle(provider, allocInfo.base,
allocInfo.baseSize,
(void *)ipcData->providerIpcData);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("umfGetIPCHandle: failed to get IPC handle.");
LOG_ERR("failed to get IPC handle.");
umf_ba_global_free(ipcData);
return ret;
}
Expand Down Expand Up @@ -95,8 +95,7 @@ umf_result_t umfOpenIPCHandle(umf_memory_pool_handle_t hPool,
umf_result_t ret = umfMemoryProviderOpenIPCHandle(
hProvider, (void *)umfIPCHandle->providerIpcData, &base);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR(
"umfOpenIPCHandle: memory provider failed to open the IPC handle.");
LOG_ERR("memory provider failed to open the IPC handle.");
return ret;
}
*ptr = (void *)((uintptr_t)base + umfIPCHandle->offset);
Expand All @@ -108,7 +107,7 @@ umf_result_t umfCloseIPCHandle(void *ptr) {
umf_alloc_info_t allocInfo;
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("umfCloseIPCHandle: cannot get alloc info for ptr = %p.", ptr);
LOG_ERR("cannot get alloc info for ptr = %p.", ptr);
return ret;
}

Expand Down
4 changes: 4 additions & 0 deletions src/memory_pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
}

*hPool = pool;
LOG_INFO("Memory pool created: %p", (void *)pool);
return UMF_RESULT_SUCCESS;

err_pool_init:
Expand All @@ -83,6 +84,9 @@ void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
// Destroy tracking provider.
umfMemoryProviderDestroy(hPool->provider);
}

LOG_INFO("Memory pool destroyed: %p", (void *)hPool);

// TODO: this free keeps memory in base allocator, so it can lead to OOM in some scenarios (it should be optimized)
umf_ba_global_free(hPool);
}
Expand Down
97 changes: 64 additions & 33 deletions src/provider/provider_tracking.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,

tracker_value_t *value = umf_ba_alloc(hTracker->tracker_allocator);
if (value == NULL) {
LOG_ERR("failed to allocate tracker value, ptr=%p, size=%zu", ptr,
size);
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
}

Expand All @@ -46,16 +48,20 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
int ret = critnib_insert(hTracker->map, (uintptr_t)ptr, value, 0);

if (ret == 0) {
LOG_DEBUG("memory region is added, tracker=%p, ptr=%p, size=%zu",
(void *)hTracker, ptr, size);
return UMF_RESULT_SUCCESS;
}

LOG_ERR("failed to insert tracker value, ret=%d, ptr=%p, size=%zu", ret,
ptr, size);

umf_ba_free(hTracker->tracker_allocator, value);

if (ret == ENOMEM) {
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
}

LOG_ERR("umfMemoryTrackerAdd: Unknown Error %d", ret);
return UMF_RESULT_ERROR_UNKNOWN;
}

Expand All @@ -70,7 +76,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,

void *value = critnib_remove(hTracker->map, (uintptr_t)ptr);
if (!value) {
LOG_ERR("umfMemoryTrackerRemove: pointer %p not found in the map", ptr);
LOG_ERR("pointer %p not found in the map", ptr);
return UMF_RESULT_ERROR_UNKNOWN;
}

Expand Down Expand Up @@ -109,6 +115,9 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
int found = critnib_find(TRACKER->map, (uintptr_t)ptr, FIND_LE,
(void *)&rkey, (void **)&rvalue);
if (!found || (uintptr_t)ptr >= rkey + rvalue->size) {
LOG_WARN("pointer %p not found in the "
"tracker, TRACKER=%p",
ptr, (void *)TRACKER);
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
}

Expand Down Expand Up @@ -151,7 +160,9 @@ static umf_result_t trackingAlloc(void *hProvider, size_t size,

umf_result_t ret2 = umfMemoryTrackerAdd(p->hTracker, p->pool, *ptr, size);
if (ret2 != UMF_RESULT_SUCCESS) {
LOG_ERR("umfMemoryTrackerAdd failed: %d", ret2);
LOG_ERR("failed to add allocated region to the tracker, ptr = %p, size "
"= %zu, ret = %d",
*ptr, size, ret2);
}

return ret;
Expand Down Expand Up @@ -181,20 +192,21 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
tracker_value_t *value =
(tracker_value_t *)critnib_get(provider->hTracker->map, (uintptr_t)ptr);
if (!value) {
LOG_ERR("tracking split: no such value");
LOG_ERR("region for split is not found in the tracker");
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
goto err;
}
if (value->size != totalSize) {
LOG_ERR("tracking split: %zu != %zu", value->size, totalSize);
LOG_ERR("tracked size %zu does not match requested size to split: %zu",
value->size, totalSize);
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
goto err;
}

ret = umfMemoryProviderAllocationSplit(provider->hUpstream, ptr, totalSize,
firstSize);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking split: umfMemoryProviderAllocationSplit failed");
LOG_ERR("upstream provider failed to split the region");
goto err;
}

Expand All @@ -206,7 +218,9 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
ret = umfMemoryTrackerAdd(provider->hTracker, provider->pool, highPtr,
secondSize);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking split: umfMemoryTrackerAdd failed");
LOG_ERR("failed to add split region to the tracker, ptr = %p, size "
"= %zu, ret = %d",
highPtr, secondSize, ret);
// TODO: what now? should we rollback the split? This can only happen due to ENOMEM
// so it's unlikely but probably the best solution would be to try to preallocate everything
// (value and critnib nodes) before calling umfMemoryProviderAllocationSplit.
Expand Down Expand Up @@ -256,33 +270,32 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
tracker_value_t *lowValue = (tracker_value_t *)critnib_get(
provider->hTracker->map, (uintptr_t)lowPtr);
if (!lowValue) {
LOG_ERR("tracking merge: no left value");
LOG_ERR("no left value");
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
goto err;
}
tracker_value_t *highValue = (tracker_value_t *)critnib_get(
provider->hTracker->map, (uintptr_t)highPtr);
if (!highValue) {
LOG_ERR("tracking merge: no right value");
LOG_ERR("no right value");
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
goto err;
}
if (lowValue->pool != highValue->pool) {
LOG_ERR("tracking merge: pool mismatch");
LOG_ERR("pool mismatch");
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
goto err;
}
if (lowValue->size + highValue->size != totalSize) {
LOG_ERR("tracking merge: lowValue->size + highValue->size != "
"totalSize");
LOG_ERR("lowValue->size + highValue->size != totalSize");
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
goto err;
}

ret = umfMemoryProviderAllocationMerge(provider->hUpstream, lowPtr, highPtr,
totalSize);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking merge: umfMemoryProviderAllocationMerge failed");
LOG_ERR("upstream provider failed to merge regions");
goto err;
}

Expand Down Expand Up @@ -328,7 +341,9 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
if (ret != UMF_RESULT_SUCCESS) {
// DO NOT return an error here, because the tracking provider
// cannot change behaviour of the upstream provider.
// TODO: LOG
LOG_ERR("failed to remove the region from the tracker, ptr=%p, "
"size=%zu, ret = %d",
ptr, size, ret);
}
}

Expand All @@ -338,17 +353,21 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
ret = umfMemoryProviderPutIPCHandle(p->hUpstream,
cache_value->providerIpcData);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking free: failed to put IPC handle");
LOG_ERR("upstream provider is failed to put IPC handle, ptr=%p, "
"size=%zu, ret = %d",
ptr, size, ret);
}
umf_ba_global_free(value);
}

ret = umfMemoryProviderFree(p->hUpstream, ptr, size);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking free: umfMemoryProviderFree failed");
LOG_ERR("upstream provider is failed to free the memory");
if (umfMemoryTrackerAdd(p->hTracker, p->pool, ptr, size) !=
UMF_RESULT_SUCCESS) {
LOG_ERR("tracking free: umfMemoryTrackerAdd failed");
LOG_ERR(
"cannot add memory back to the tracker, ptr = %p, size = %zu",
ptr, size);
}
return ret;
}
Expand Down Expand Up @@ -485,34 +504,30 @@ static umf_result_t trackingGetIpcHandle(void *provider, const void *ptr,
ret = umfMemoryProviderGetIPCHandle(p->hUpstream, ptr, size,
providerIpcData);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking get ipc handle: "
"umfMemoryProviderGetIPCHandle failed");
LOG_ERR("upstream provider is failed to get IPC handle");
return ret;
}

ret = umfMemoryProviderGetIPCHandleSize(p->hUpstream, &ipcDataSize);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking get ipc handle: "
"umfMemoryProviderGetIPCHandleSize failed");
LOG_ERR("upstream provider is failed to get the size of IPC "
"handle");
ret = umfMemoryProviderPutIPCHandle(p->hUpstream,
providerIpcData);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking get ipc handle: "
"umfMemoryProviderPutIPCHandle failed");
LOG_ERR("upstream provider is failed to put IPC handle");
}
return ret;
}

size_t value_size = sizeof(ipc_cache_value_t) + ipcDataSize;
ipc_cache_value_t *cache_value = umf_ba_global_alloc(value_size);
if (!cache_value) {
LOG_ERR(
"tracking get ipc handle: failed to allocate cache_value");
LOG_ERR("failed to allocate cache_value");
ret = umfMemoryProviderPutIPCHandle(p->hUpstream,
providerIpcData);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking get ipc handle: "
"umfMemoryProviderPutIPCHandle failed");
LOG_ERR("upstream provider is failed to put IPC handle");
}
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
}
Expand All @@ -538,13 +553,11 @@ static umf_result_t trackingGetIpcHandle(void *provider, const void *ptr,
ret = umfMemoryProviderPutIPCHandle(p->hUpstream,
providerIpcData);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("tracking get ipc handle: "
"umfMemoryProviderPutIPCHandle failed");
LOG_ERR("upstream provider is failed to put IPC handle");
return ret;
}
if (insRes == ENOMEM) {
LOG_ERR(
"tracking get ipc handle: insert to IPC cache failed");
LOG_ERR("insert to IPC cache failed due to OOM");
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
}
}
Expand Down Expand Up @@ -585,13 +598,19 @@ static umf_result_t trackingOpenIpcHandle(void *provider, void *providerIpcData,

ret = umfMemoryProviderOpenIPCHandle(p->hUpstream, providerIpcData, ptr);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("upstream provider is failed to open IPC handle");
return ret;
}
size_t bufferSize = getDataSizeFromIpcHandle(providerIpcData);
ret = umfMemoryTrackerAdd(p->hTracker, p->pool, *ptr, bufferSize);
if (ret != UMF_RESULT_SUCCESS) {
LOG_ERR("failed to add IPC region to the tracker, ptr=%p, size=%zu, "
"ret = %d",
*ptr, bufferSize, ret);
if (umfMemoryProviderCloseIPCHandle(p->hUpstream, *ptr, bufferSize)) {
// TODO: LOG
LOG_ERR("upstream provider is failed to close IPC handle, ptr=%p, "
"size=%zu",
*ptr, bufferSize);
}
}
return ret;
Expand All @@ -611,7 +630,9 @@ static umf_result_t trackingCloseIpcHandle(void *provider, void *ptr,
if (ret != UMF_RESULT_SUCCESS) {
// DO NOT return an error here, because the tracking provider
// cannot change behaviour of the upstream provider.
LOG_ERR("tracking free: umfMemoryTrackerRemove failed");
LOG_ERR("failed to remove the region from the tracker, ptr=%p, "
"size=%zu, ret = %d",
ptr, size, ret);
}
}
return umfMemoryProviderCloseIPCHandle(p->hUpstream, ptr, size);
Expand Down Expand Up @@ -645,14 +666,21 @@ umf_result_t umfTrackingMemoryProviderCreate(
params.hUpstream = hUpstream;
params.hTracker = TRACKER;
if (!params.hTracker) {
LOG_ERR("failed, TRACKER is NULL");
return UMF_RESULT_ERROR_UNKNOWN;
}
params.pool = hPool;
params.ipcCache = critnib_new();
if (!params.ipcCache) {
LOG_ERR("failed to create IPC cache");
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
}

LOG_DEBUG("upstream=%p, tracker=%p, "
"pool=%p, ipcCache=%p",
(void *)params.hUpstream, (void *)params.hTracker,
(void *)params.pool, (void *)params.ipcCache);

return umfMemoryProviderCreate(&UMF_TRACKING_MEMORY_PROVIDER_OPS, &params,
hTrackingProvider);
}
Expand Down Expand Up @@ -691,6 +719,9 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
goto err_destroy_mutex;
}

LOG_DEBUG("tracker created, handle=%p, segment map=%p", (void *)handle,
(void *)handle->map);

return handle;

err_destroy_mutex:
Expand Down
Loading