Skip to content

Commit 4c40aae

Browse files
committed
add memory properties API
1 parent fe3aea6 commit 4c40aae

37 files changed

+1282
-96
lines changed

.github/workflows/.spellcheck-conf.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[default]
22
# Don't correct the following words:
3-
extend-ignore-words-re = ["ASSER", "Tne", "ba", "BA", "PN"]
3+
extend-ignore-words-re = ["ASSER", "Tne", "ba", "BA", "PN", "usm"]
44

55
[files]
66
# completely exclude those files from consideration:

docs/config/api.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,12 @@ Memtarget
170170
.. doxygenfile:: experimental/memtarget.h
171171
:sections: define enum typedef func
172172

173+
Memory Properties
174+
==========================================
175+
176+
.. doxygenfile:: memory_props.h
177+
:sections: define enum typedef func var
178+
173179
Inter-Process Communication
174180
==========================================
175181

docs/config/spelling_exceptions.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ partList
4747
pid
4848
poolable
4949
preallocated
50+
propertyId
5051
providerIpcData
5152
providential
5253
ptr
@@ -71,4 +72,5 @@ umfPoolMallocUsableSize
7172
umfPoolRealloc
7273
umfMemspaceUserFilter
7374
umfMemspaceMemtargetAdd
74-
unfreed
75+
unfreed
76+
usm

include/umf/base.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,33 @@ typedef enum umf_result_t {
5151
UMF_RESULT_ERROR_UNKNOWN = 0x7ffffffe ///< Unknown error
5252
} umf_result_t;
5353

54+
/// @brief Handle to the memory properties structure
55+
typedef struct umf_memory_properties_t *umf_memory_properties_handle_t;
56+
57+
/// @brief ID of the memory property
58+
typedef enum umf_memory_property_id_t {
59+
UMF_MEMORY_PROPERTY_INVALID = -1, ///< Invalid property
60+
61+
// UMF specific
62+
UMF_MEMORY_PROPERTY_PROVIDER_HANDLE = 0, ///< Handle to the memory provider
63+
UMF_MEMORY_PROPERTY_POOL_HANDLE = 1, ///< Handle to the memory pool
64+
65+
// generic pointer properties
66+
UMF_MEMORY_PROPERTY_POINTER_TYPE =
67+
2, ///< Type of the pointer (umf_usm_memory_type_t)
68+
UMF_MEMORY_PROPERTY_BASE_ADDRESS = 3, ///< Base address of the allocation
69+
UMF_MEMORY_PROPERTY_BASE_SIZE = 4, ///< Base size of the allocation
70+
UMF_MEMORY_PROPERTY_BUFFER_ID = 5, ///< Unique identifier for the buffer
71+
72+
// GPU specific
73+
UMF_MEMORY_PROPERTY_CONTEXT = 6, ///< GPU context of the allocation
74+
UMF_MEMORY_PROPERTY_DEVICE = 7, ///< GPU device where the allocation resides
75+
76+
/// @cond
77+
UMF_MEMORY_PROPERTY_MAX_RESERVED = 0x1000, ///< Maximum reserved value
78+
/// @endcond
79+
} umf_memory_property_id_t;
80+
5481
/// @brief Type of the CTL query
5582
typedef enum umf_ctl_query_type {
5683
CTL_QUERY_READ,

include/umf/memory_props.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
*
3+
* Copyright (C) 2025 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#ifndef UMF_MEMORY_PROPS_H
11+
#define UMF_MEMORY_PROPS_H 1
12+
13+
#include <umf/base.h>
14+
15+
#ifdef __cplusplus
16+
extern "C" {
17+
#endif
18+
19+
/// @brief Get the memory properties handle for a given pointer
20+
/// \details
21+
/// The handle returned by this function is valid until the memory pointed
22+
/// to by the pointer is freed.
23+
/// @param ptr pointer to the allocated memory
24+
/// @param props_handle [out] pointer to the memory properties handle
25+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure
26+
umf_result_t
27+
umfGetMemoryPropertiesHandle(const void *ptr,
28+
umf_memory_properties_handle_t *props_handle);
29+
30+
/// @brief Get a specific memory property from the properties handle
31+
/// @param props_handle handle to the memory properties
32+
/// @param memory_property_id ID of the memory property to get
33+
/// @param max_property_size size of the property value buffer
34+
/// @param property_value [out] pointer to the value of the memory property
35+
/// which will be filled
36+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure
37+
umf_result_t umfGetMemoryProperty(umf_memory_properties_handle_t props_handle,
38+
umf_memory_property_id_t memory_property_id,
39+
size_t max_property_size,
40+
void *property_value);
41+
42+
#ifdef __cplusplus
43+
}
44+
#endif
45+
46+
#endif /* UMF_MEMORY_PROPS_H */

include/umf/memory_provider.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,21 @@ umf_result_t
265265
umfMemoryProviderAllocationMerge(umf_memory_provider_handle_t hProvider,
266266
void *lowPtr, void *highPtr, size_t totalSize);
267267

268+
///
269+
/// @brief Retrieve properties of the memory allocation.
270+
/// @param hProvider pointer to the memory provider
271+
/// @param ptr pointer to the allocated memory
272+
/// @param propertyId identifier of the memory property to retrieve
273+
/// @param max_property_size size of the property value buffer
274+
/// @param property_value [out] pointer to the value of the memory property
275+
/// which will be filled
276+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure
277+
///
278+
umf_result_t umfMemoryProviderGetAllocationProperties(
279+
umf_memory_provider_handle_t hProvider, const void *ptr,
280+
umf_memory_property_id_t propertyId, size_t max_property_size,
281+
void *property_value);
282+
268283
#ifdef __cplusplus
269284
}
270285
#endif

include/umf/memory_provider_ops.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,21 @@ typedef struct umf_memory_provider_ops_t {
278278
const char *name, void *arg, size_t size,
279279
umf_ctl_query_type_t queryType, va_list args);
280280

281+
///
282+
/// @brief Retrieve properties of the memory allocation.
283+
/// @param provider pointer to the memory provider
284+
/// @param ptr pointer to the allocated memory
285+
/// @param memory_property_id identifier of the memory property to retrieve
286+
/// @param max_property_size size of the property value buffer
287+
/// @param property_value [out] pointer to the value of the memory property
288+
/// which will be filled
289+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure
290+
///
291+
umf_result_t (*ext_get_allocation_properties)(
292+
void *provider, const void *ptr,
293+
umf_memory_property_id_t memory_property_id, size_t max_property_size,
294+
void *value);
295+
281296
} umf_memory_provider_ops_t;
282297

283298
#ifdef __cplusplus

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ set(UMF_SOURCES
4444
ipc.c
4545
ipc_cache.c
4646
memory_pool.c
47+
memory_props.c
4748
memory_provider.c
4849
memory_provider_get_last_failed.c
4950
memtarget.c

src/ipc.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,19 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
5858
}
5959

6060
size_t ipcHandleSize = 0;
61-
umf_alloc_info_t allocInfo;
62-
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
61+
umf_memory_properties_handle_t props = NULL;
62+
umf_result_t ret = umfGetMemoryPropertiesHandle(ptr, &props);
6363
if (ret != UMF_RESULT_SUCCESS) {
64-
LOG_ERR("cannot get alloc info for ptr = %p.", ptr);
64+
LOG_ERR("cannot get alloc props for ptr = %p.", ptr);
6565
return ret;
6666
}
6767

68-
ret = umfPoolGetIPCHandleSize(allocInfo.pool, &ipcHandleSize);
68+
if (props == NULL || props->pool == NULL) {
69+
LOG_ERR("cannot get pool from alloc info for ptr = %p.", ptr);
70+
return UMF_RESULT_ERROR_UNKNOWN;
71+
}
72+
73+
ret = umfPoolGetIPCHandleSize(props->pool, &ipcHandleSize);
6974
if (ret != UMF_RESULT_SUCCESS) {
7075
LOG_ERR("cannot get IPC handle size.");
7176
return ret;
@@ -79,11 +84,14 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
7984

8085
// We cannot use umfPoolGetMemoryProvider function because it returns
8186
// upstream provider but we need tracking one
82-
umf_memory_provider_handle_t provider = allocInfo.pool->provider;
83-
assert(provider);
87+
if (props == NULL || props->pool == NULL || props->pool->provider == NULL) {
88+
LOG_ERR("cannot get memory provider from pool");
89+
umf_ba_global_free(ipcData);
90+
return UMF_RESULT_ERROR_UNKNOWN;
91+
}
92+
umf_memory_provider_handle_t provider = props->pool->provider;
8493

85-
ret = umfMemoryProviderGetIPCHandle(provider, allocInfo.base,
86-
allocInfo.baseSize,
94+
ret = umfMemoryProviderGetIPCHandle(provider, props->base, props->base_size,
8795
(void *)ipcData->providerIpcData);
8896
if (ret != UMF_RESULT_SUCCESS) {
8997
LOG_ERR("failed to get IPC handle.");
@@ -92,10 +100,10 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
92100
}
93101

94102
// ipcData->handle_id is filled by tracking provider
95-
ipcData->base = allocInfo.base;
103+
ipcData->base = props->base;
96104
ipcData->pid = utils_getpid();
97-
ipcData->baseSize = allocInfo.baseSize;
98-
ipcData->offset = (uintptr_t)ptr - (uintptr_t)allocInfo.base;
105+
ipcData->baseSize = props->base_size;
106+
ipcData->offset = (uintptr_t)ptr - (uintptr_t)props->base;
99107

100108
*umfIPCHandle = ipcData;
101109
*size = ipcHandleSize;

src/libumf.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,10 @@ EXPORTS
140140
umfCtlExec
141141
umfCtlGet
142142
umfCtlSet
143+
umfGetMemoryPropertiesHandle
144+
umfGetMemoryProperty
143145
umfJemallocPoolParamsCreate
144146
umfJemallocPoolParamsDestroy
145147
umfJemallocPoolParamsSetNumArenas
148+
umfMemoryProviderGetAllocationProperties
146149
umfPoolGetName

0 commit comments

Comments
 (0)