@@ -24,9 +24,41 @@ umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) {
2424 return NULL ;
2525}
2626
27+ umf_result_t umfDevDaxMemoryProviderParamsCreate (
28+ umf_devdax_memory_provider_params_handle_t * hParams , const char * path ,
29+ size_t size ) {
30+ (void )hParams ;
31+ (void )path ;
32+ (void )size ;
33+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
34+ }
35+
36+ umf_result_t umfDevDaxMemoryProviderParamsDestroy (
37+ umf_devdax_memory_provider_params_handle_t hParams ) {
38+ (void )hParams ;
39+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
40+ }
41+
42+ umf_result_t umfDevDaxMemoryProviderParamsSetDeviceDax (
43+ umf_devdax_memory_provider_params_handle_t hParams , const char * path ,
44+ size_t size ) {
45+ (void )hParams ;
46+ (void )path ;
47+ (void )size ;
48+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
49+ }
50+
51+ umf_result_t umfDevDaxMemoryProviderParamsSetProtection (
52+ umf_devdax_memory_provider_params_handle_t hParams , unsigned protection ) {
53+ (void )hParams ;
54+ (void )protection ;
55+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
56+ }
57+
2758#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
2859
2960#include "base_alloc_global.h"
61+ #include "libumf.h"
3062#include "utils_common.h"
3163#include "utils_concurrency.h"
3264#include "utils_log.h"
@@ -44,6 +76,13 @@ typedef struct devdax_memory_provider_t {
4476 unsigned protection ; // combination of OS-specific protection flags
4577} devdax_memory_provider_t ;
4678
79+ // DevDax Memory provider settings struct
80+ typedef struct umf_devdax_memory_provider_params_t {
81+ char * path ;
82+ size_t size ;
83+ unsigned protection ;
84+ } umf_devdax_memory_provider_params_t ;
85+
4786typedef struct devdax_last_native_error_t {
4887 int32_t native_error ;
4988 int errno_value ;
@@ -511,4 +550,110 @@ umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) {
511550 return & UMF_DEVDAX_MEMORY_PROVIDER_OPS ;
512551}
513552
553+ umf_result_t umfDevDaxMemoryProviderParamsCreate (
554+ umf_devdax_memory_provider_params_handle_t * hParams , const char * path ,
555+ size_t size ) {
556+ libumfInit ();
557+ if (hParams == NULL ) {
558+ LOG_ERR ("DevDax Memory Provider params handle is NULL" );
559+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
560+ }
561+
562+ if (path == NULL ) {
563+ LOG_ERR ("DevDax path is NULL" );
564+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
565+ }
566+
567+ umf_devdax_memory_provider_params_handle_t params =
568+ umf_ba_global_alloc (sizeof (* params ));
569+ if (params == NULL ) {
570+ LOG_ERR (
571+ "Allocating memory for the DevDax Memory Provider params failed" );
572+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
573+ }
574+
575+ params -> path = NULL ;
576+ params -> size = 0 ;
577+ params -> protection = UMF_PROTECTION_READ | UMF_PROTECTION_WRITE ;
578+
579+ umf_result_t res =
580+ umfDevDaxMemoryProviderParamsSetDeviceDax (params , path , size );
581+ if (res != UMF_RESULT_SUCCESS ) {
582+ umf_ba_global_free (params );
583+ return res ;
584+ }
585+
586+ * hParams = params ;
587+
588+ return UMF_RESULT_SUCCESS ;
589+ }
590+
591+ umf_result_t umfDevDaxMemoryProviderParamsDestroy (
592+ umf_devdax_memory_provider_params_handle_t hParams ) {
593+ if (hParams != NULL ) {
594+ umf_ba_global_free (hParams -> path );
595+ umf_ba_global_free (hParams );
596+ }
597+
598+ return UMF_RESULT_SUCCESS ;
599+ }
600+
601+ umf_result_t umfDevDaxMemoryProviderParamsSetDeviceDax (
602+ umf_devdax_memory_provider_params_handle_t hParams , const char * path ,
603+ size_t size ) {
604+ if (hParams == NULL ) {
605+ LOG_ERR ("DevDax Memory Provider params handle is NULL" );
606+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
607+ }
608+
609+ if (path == NULL ) {
610+ LOG_ERR ("DevDax path is NULL" );
611+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
612+ }
613+
614+ size_t path_len = strlen (path );
615+ if (path_len == 0 ) {
616+ LOG_ERR ("DevDax path is empty" );
617+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
618+ }
619+
620+ path_len += 1 ; // for the null terminator
621+ char * new_path = umf_ba_global_alloc (path_len );
622+ if (new_path == NULL ) {
623+ LOG_ERR ("Allocating memory for the DevDax path failed" );
624+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
625+ }
626+
627+ strncpy (new_path , path , path_len );
628+
629+ umf_ba_global_free (hParams -> path );
630+
631+ hParams -> path = new_path ;
632+ hParams -> size = size ;
633+
634+ return UMF_RESULT_SUCCESS ;
635+ }
636+
637+ umf_result_t umfDevDaxMemoryProviderParamsSetProtection (
638+ umf_devdax_memory_provider_params_handle_t hParams , unsigned protection ) {
639+ if (hParams == NULL ) {
640+ LOG_ERR ("DevDax Memory Provider params handle is NULL" );
641+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
642+ }
643+
644+ // verify that protection contains only valid bits set
645+ // (UMF_PROTECTION_MAX-1) - highest possible bit
646+ // (UMF_PROTECTION_MAX-1) << 1 - next after highest possible bit
647+ // ((UMF_PROTECTION_MAX-1) << 1) - 1 - all valid bits set
648+ const unsigned VALID_FLAGS_ALL = ((UMF_PROTECTION_MAX - 1 ) << 1 ) - 1 ;
649+ if (protection & ~VALID_FLAGS_ALL || protection == 0 ) {
650+ LOG_ERR ("Incorrect memory protection flags: %u" , protection );
651+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
652+ }
653+
654+ hParams -> protection = protection ;
655+
656+ return UMF_RESULT_SUCCESS ;
657+ }
658+
514659#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
0 commit comments