8
8
#include <assert.h>
9
9
#include <stdbool.h>
10
10
#include <stddef.h>
11
+ #include <stdint.h>
11
12
#include <string.h>
12
13
13
14
#include <umf.h>
@@ -753,9 +754,22 @@ static umf_result_t ze_memory_provider_allocation_split(void *provider,
753
754
754
755
typedef struct ze_ipc_data_t {
755
756
int pid ;
757
+ uint64_t id ; // Unique identifier for the IPC handle
758
+ uint64_t checksum ;
756
759
ze_ipc_mem_handle_t ze_handle ;
757
760
} ze_ipc_data_t ;
758
761
762
+ // Compute a simple checksum of the ze_handle field in ze_ipc_data_t
763
+ static uint64_t ze_ipc_handle_checksum (const ze_ipc_data_t * ipc_data ) {
764
+ // Interpret the ze_handle as a byte array
765
+ const uint8_t * bytes = (const uint8_t * )& ipc_data -> ze_handle ;
766
+ uint64_t checksum = 0 ;
767
+ for (size_t i = 0 ; i < sizeof (ipc_data -> ze_handle ); ++ i ) {
768
+ checksum += bytes [i ];
769
+ }
770
+ return checksum ;
771
+ }
772
+
759
773
static umf_result_t ze_memory_provider_get_ipc_handle_size (void * provider ,
760
774
size_t * size ) {
761
775
(void )provider ;
@@ -770,6 +784,8 @@ static umf_result_t ze_memory_provider_get_ipc_handle(void *provider,
770
784
void * providerIpcData ) {
771
785
(void )size ;
772
786
787
+ static uint64_t id = 0 ;
788
+
773
789
ze_result_t ze_result ;
774
790
ze_ipc_data_t * ze_ipc_data = (ze_ipc_data_t * )providerIpcData ;
775
791
struct ze_memory_provider_t * ze_provider =
@@ -783,6 +799,11 @@ static umf_result_t ze_memory_provider_get_ipc_handle(void *provider,
783
799
}
784
800
785
801
ze_ipc_data -> pid = utils_getpid ();
802
+ ze_ipc_data -> checksum = ze_ipc_handle_checksum (ze_ipc_data );
803
+ ze_ipc_data -> id = id ++ ;
804
+
805
+ LOG_DEBUG ("GET handle(): pid = %d, id = %lu, checksum = %lu" , ze_ipc_data -> pid ,
806
+ ze_ipc_data -> id , ze_ipc_data -> checksum );
786
807
787
808
return UMF_RESULT_SUCCESS ;
788
809
}
@@ -801,6 +822,16 @@ static umf_result_t ze_memory_provider_put_ipc_handle(void *provider,
801
822
return UMF_RESULT_SUCCESS ;
802
823
}
803
824
825
+ if (ze_ipc_data -> checksum != ze_ipc_handle_checksum (ze_ipc_data )) {
826
+ LOG_FATAL (
827
+ "Checksum mismatch for IPC handle data: pid = %d, checksum = %lu" ,
828
+ ze_ipc_data -> pid , ze_ipc_data -> checksum );
829
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
830
+ }
831
+
832
+ LOG_DEBUG ("PUT handle(): pid = %d, id = %lu, checksum = %lu" , ze_ipc_data -> pid ,
833
+ ze_ipc_data -> id , ze_ipc_data -> checksum );
834
+
804
835
ze_result = g_ze_ops .zeMemPutIpcHandle (ze_provider -> context ,
805
836
ze_ipc_data -> ze_handle );
806
837
if (ze_result != ZE_RESULT_SUCCESS ) {
0 commit comments