@@ -67,6 +67,7 @@ umf_result_t umfDevDaxMemoryProviderParamsSetProtection(
6767#include "base_alloc_global.h"
6868#include "coarse.h"
6969#include "libumf.h"
70+ #include "provider_ctl_stats_type.h"
7071#include "utils_common.h"
7172#include "utils_concurrency.h"
7273#include "utils_log.h"
@@ -83,8 +84,12 @@ typedef struct devdax_memory_provider_t {
8384 utils_mutex_t lock ; // lock of ptr and offset
8485 unsigned protection ; // combination of OS-specific protection flags
8586 coarse_t * coarse ; // coarse library handle
87+ ctl_stats_t stats ;
8688} devdax_memory_provider_t ;
8789
90+ #define CTL_PROVIDER_TYPE devdax_memory_provider_t
91+ #include "provider_ctl_stats_impl.h"
92+
8893// DevDax Memory provider settings struct
8994typedef struct umf_devdax_memory_provider_params_t {
9095 char * path ;
@@ -112,6 +117,9 @@ static __TLS devdax_last_native_error_t TLS_last_native_error;
112117#define _UMF_DEVDAX_RESULT_ERROR_PURGE_FORCE_FAILED \
113118 (UMF_DEVDAX_RESULT_ERROR_PURGE_FORCE_FAILED - UMF_DEVDAX_RESULT_SUCCESS)
114119
120+ struct ctl devdax_memory_ctl_root ;
121+ static UTIL_ONCE_FLAG ctl_initialized = UTIL_ONCE_FLAG_INIT ;
122+
115123static const char * Native_error_str [] = {
116124 [_UMF_DEVDAX_RESULT_SUCCESS ] = "success" ,
117125 [_UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED ] = "memory allocation failed" ,
@@ -127,6 +135,10 @@ static void devdax_store_last_native_error(int32_t native_error,
127135 TLS_last_native_error .errno_value = errno_value ;
128136}
129137
138+ static void initialize_devdax_ctl (void ) {
139+ CTL_REGISTER_MODULE (& devdax_memory_ctl_root , stats );
140+ }
141+
130142static umf_result_t
131143devdax_translate_params (const umf_devdax_memory_provider_params_t * in_params ,
132144 devdax_memory_provider_t * provider ) {
@@ -284,7 +296,12 @@ static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,
284296 void * * resultPtr ) {
285297 devdax_memory_provider_t * devdax_provider =
286298 (devdax_memory_provider_t * )provider ;
287- return coarse_alloc (devdax_provider -> coarse , size , alignment , resultPtr );
299+ umf_result_t ret =
300+ coarse_alloc (devdax_provider -> coarse , size , alignment , resultPtr );
301+ if (ret == UMF_RESULT_SUCCESS ) {
302+ provider_ctl_stats_alloc (devdax_provider , size );
303+ }
304+ return ret ;
288305}
289306
290307static umf_result_t devdax_get_last_native_error (void * provider ,
@@ -531,10 +548,23 @@ static umf_result_t devdax_close_ipc_handle(void *provider, void *ptr,
531548 return UMF_RESULT_SUCCESS ;
532549}
533550
551+ static umf_result_t devdax_ctl (void * provider ,
552+ umf_ctl_query_source_t operationType ,
553+ const char * name , void * arg , size_t size ,
554+ umf_ctl_query_type_t query_type , va_list args ) {
555+ utils_init_once (& ctl_initialized , initialize_devdax_ctl );
556+ return ctl_query (& devdax_memory_ctl_root , provider , operationType , name ,
557+ query_type , arg , size , args );
558+ }
559+
534560static umf_result_t devdax_free (void * provider , void * ptr , size_t size ) {
535561 devdax_memory_provider_t * devdax_provider =
536562 (devdax_memory_provider_t * )provider ;
537- return coarse_free (devdax_provider -> coarse , ptr , size );
563+ umf_result_t ret = coarse_free (devdax_provider -> coarse , ptr , size );
564+ if (ret == UMF_RESULT_SUCCESS ) {
565+ provider_ctl_stats_free (devdax_provider , size );
566+ }
567+ return ret ;
538568}
539569
540570static umf_memory_provider_ops_t UMF_DEVDAX_MEMORY_PROVIDER_OPS = {
@@ -555,7 +585,8 @@ static umf_memory_provider_ops_t UMF_DEVDAX_MEMORY_PROVIDER_OPS = {
555585 .ext_get_ipc_handle = devdax_get_ipc_handle ,
556586 .ext_put_ipc_handle = devdax_put_ipc_handle ,
557587 .ext_open_ipc_handle = devdax_open_ipc_handle ,
558- .ext_close_ipc_handle = devdax_close_ipc_handle };
588+ .ext_close_ipc_handle = devdax_close_ipc_handle ,
589+ .ext_ctl = devdax_ctl };
559590
560591const umf_memory_provider_ops_t * umfDevDaxMemoryProviderOps (void ) {
561592 return & UMF_DEVDAX_MEMORY_PROVIDER_OPS ;
0 commit comments