@@ -24,9 +24,41 @@ umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) {
24
24
return NULL ;
25
25
}
26
26
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
+
27
58
#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
28
59
29
60
#include "base_alloc_global.h"
61
+ #include "libumf.h"
30
62
#include "utils_common.h"
31
63
#include "utils_concurrency.h"
32
64
#include "utils_log.h"
@@ -44,6 +76,13 @@ typedef struct devdax_memory_provider_t {
44
76
unsigned protection ; // combination of OS-specific protection flags
45
77
} devdax_memory_provider_t ;
46
78
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
+
47
86
typedef struct devdax_last_native_error_t {
48
87
int32_t native_error ;
49
88
int errno_value ;
@@ -511,4 +550,110 @@ umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) {
511
550
return & UMF_DEVDAX_MEMORY_PROVIDER_OPS ;
512
551
}
513
552
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
+
514
659
#endif // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
0 commit comments