@@ -285,11 +285,16 @@ static umf_result_t ze_memory_provider_allocation_split(void *provider,
285
285
return UMF_RESULT_ERROR_NOT_SUPPORTED ;
286
286
}
287
287
288
+ typedef struct ze_ipc_data_t {
289
+ int pid ;
290
+ ze_ipc_mem_handle_t ze_handle ;
291
+ } ze_ipc_data_t ;
292
+
288
293
static umf_result_t ze_memory_provider_get_ipc_handle_size (void * provider ,
289
294
size_t * size ) {
290
295
(void )provider ;
291
296
ASSERT (size != NULL );
292
- * size = sizeof (ze_ipc_mem_handle_t );
297
+ * size = sizeof (ze_ipc_data_t );
293
298
return UMF_RESULT_SUCCESS ;
294
299
}
295
300
@@ -301,17 +306,19 @@ static umf_result_t ze_memory_provider_get_ipc_handle(void *provider,
301
306
ASSERT (providerIpcData != NULL );
302
307
(void )size ;
303
308
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 ;
305
310
struct ze_memory_provider_t * ze_provider =
306
311
(struct ze_memory_provider_t * )provider ;
307
312
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 );
310
315
if (ze_result != ZE_RESULT_SUCCESS ) {
311
316
LOG_ERR ("zeMemGetIpcHandle() failed." );
312
317
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
313
318
}
314
319
320
+ ze_ipc_data -> pid = utils_getpid ();
321
+
315
322
return UMF_RESULT_SUCCESS ;
316
323
}
317
324
@@ -322,7 +329,7 @@ static umf_result_t ze_memory_provider_put_ipc_handle(void *provider,
322
329
ze_result_t ze_result ;
323
330
struct ze_memory_provider_t * ze_provider =
324
331
(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 ;
326
333
327
334
if (g_ze_ops .zeMemPutIpcHandle == NULL ) {
328
335
// 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,
331
338
return UMF_RESULT_SUCCESS ;
332
339
}
333
340
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 );
336
343
if (ze_result != ZE_RESULT_SUCCESS ) {
337
344
LOG_ERR ("zeMemPutIpcHandle() failed." );
338
345
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
@@ -347,12 +354,29 @@ static umf_result_t ze_memory_provider_open_ipc_handle(void *provider,
347
354
ASSERT (providerIpcData != NULL );
348
355
ASSERT (ptr != NULL );
349
356
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 ;
351
358
struct ze_memory_provider_t * ze_provider =
352
359
(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
+ }
353
374
354
375
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
+ (void )utils_close_fd (fd_local );
379
+ }
356
380
if (ze_result != ZE_RESULT_SUCCESS ) {
357
381
LOG_ERR ("zeMemOpenIpcHandle() failed." );
358
382
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
0 commit comments