@@ -285,11 +285,16 @@ static umf_result_t ze_memory_provider_allocation_split(void *provider,
285285 return UMF_RESULT_ERROR_NOT_SUPPORTED ;
286286}
287287
288+ typedef struct ze_ipc_data_t {
289+ int pid ;
290+ ze_ipc_mem_handle_t ze_handle ;
291+ } ze_ipc_data_t ;
292+
288293static umf_result_t ze_memory_provider_get_ipc_handle_size (void * provider ,
289294 size_t * size ) {
290295 (void )provider ;
291296 ASSERT (size != NULL );
292- * size = sizeof (ze_ipc_mem_handle_t );
297+ * size = sizeof (ze_ipc_data_t );
293298 return UMF_RESULT_SUCCESS ;
294299}
295300
@@ -301,17 +306,19 @@ static umf_result_t ze_memory_provider_get_ipc_handle(void *provider,
301306 ASSERT (providerIpcData != NULL );
302307 (void )size ;
303308 ze_result_t ze_result ;
304- ze_ipc_mem_handle_t * ze_ipc_handle = (ze_ipc_mem_handle_t * )providerIpcData ;
309+ ze_ipc_data_t * ze_ipc_data = (ze_ipc_data_t * )providerIpcData ;
305310 struct ze_memory_provider_t * ze_provider =
306311 (struct ze_memory_provider_t * )provider ;
307312
308- ze_result =
309- g_ze_ops . zeMemGetIpcHandle ( ze_provider -> context , ptr , ze_ipc_handle );
313+ ze_result = g_ze_ops . zeMemGetIpcHandle ( ze_provider -> context , ptr ,
314+ & ze_ipc_data -> ze_handle );
310315 if (ze_result != ZE_RESULT_SUCCESS ) {
311316 LOG_ERR ("zeMemGetIpcHandle() failed." );
312317 return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
313318 }
314319
320+ ze_ipc_data -> pid = utils_getpid ();
321+
315322 return UMF_RESULT_SUCCESS ;
316323}
317324
@@ -322,7 +329,7 @@ static umf_result_t ze_memory_provider_put_ipc_handle(void *provider,
322329 ze_result_t ze_result ;
323330 struct ze_memory_provider_t * ze_provider =
324331 (struct ze_memory_provider_t * )provider ;
325- ze_ipc_mem_handle_t * ze_ipc_handle = (ze_ipc_mem_handle_t * )providerIpcData ;
332+ ze_ipc_data_t * ze_ipc_data = (ze_ipc_data_t * )providerIpcData ;
326333
327334 if (g_ze_ops .zeMemPutIpcHandle == NULL ) {
328335 // g_ze_ops.zeMemPutIpcHandle can be NULL because it was introduced
@@ -331,8 +338,8 @@ static umf_result_t ze_memory_provider_put_ipc_handle(void *provider,
331338 return UMF_RESULT_SUCCESS ;
332339 }
333340
334- ze_result =
335- g_ze_ops . zeMemPutIpcHandle ( ze_provider -> context , * ze_ipc_handle );
341+ ze_result = g_ze_ops . zeMemPutIpcHandle ( ze_provider -> context ,
342+ ze_ipc_data -> ze_handle );
336343 if (ze_result != ZE_RESULT_SUCCESS ) {
337344 LOG_ERR ("zeMemPutIpcHandle() failed." );
338345 return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
@@ -347,12 +354,29 @@ static umf_result_t ze_memory_provider_open_ipc_handle(void *provider,
347354 ASSERT (providerIpcData != NULL );
348355 ASSERT (ptr != NULL );
349356 ze_result_t ze_result ;
350- ze_ipc_mem_handle_t * ze_ipc_handle = (ze_ipc_mem_handle_t * )providerIpcData ;
357+ ze_ipc_data_t * ze_ipc_data = (ze_ipc_data_t * )providerIpcData ;
351358 struct ze_memory_provider_t * ze_provider =
352359 (struct ze_memory_provider_t * )provider ;
360+ int fd_local = -1 ;
361+ ze_ipc_mem_handle_t ze_ipc_handle = ze_ipc_data -> ze_handle ;
362+
363+ if (ze_ipc_data -> pid != utils_getpid ()) {
364+ int fd_remote = -1 ;
365+ memcpy (& fd_remote , & ze_ipc_handle , sizeof (fd_remote ));
366+ umf_result_t umf_result =
367+ utils_duplicate_fd (ze_ipc_data -> pid , fd_remote , & fd_local );
368+ if (umf_result != UMF_RESULT_SUCCESS ) {
369+ LOG_PERR ("duplicating file descriptor failed" );
370+ return umf_result ;
371+ }
372+ memcpy (& ze_ipc_handle , & fd_local , sizeof (fd_local ));
373+ }
353374
354375 ze_result = g_ze_ops .zeMemOpenIpcHandle (
355- ze_provider -> context , ze_provider -> device , * ze_ipc_handle , 0 , ptr );
376+ ze_provider -> context , ze_provider -> device , ze_ipc_handle , 0 , ptr );
377+ if (fd_local != -1 ) {
378+ utils_close_fd (fd_local );
379+ }
356380 if (ze_result != ZE_RESULT_SUCCESS ) {
357381 LOG_ERR ("zeMemOpenIpcHandle() failed." );
358382 return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
0 commit comments