@@ -63,6 +63,25 @@ typedef struct ze_ops_t {
63
63
static ze_ops_t g_ze_ops ;
64
64
static UTIL_ONCE_FLAG ze_is_initialized = UTIL_ONCE_FLAG_INIT ;
65
65
static bool Init_ze_global_state_failed ;
66
+ static __TLS ze_result_t TLS_last_native_error ;
67
+
68
+ static void store_last_native_error (int32_t native_error ) {
69
+ TLS_last_native_error = native_error ;
70
+ }
71
+
72
+ umf_result_t ze2umf_result (ze_result_t result ) {
73
+ switch (result ) {
74
+ case ZE_RESULT_SUCCESS :
75
+ return UMF_RESULT_SUCCESS ;
76
+ case ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY :
77
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
78
+ case ZE_RESULT_ERROR_INVALID_ARGUMENT :
79
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
80
+ default :
81
+ store_last_native_error (result );
82
+ return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
83
+ }
84
+ }
66
85
67
86
static void init_ze_global_state (void ) {
68
87
#ifdef _WIN32
@@ -130,11 +149,12 @@ umf_result_t ze_memory_provider_initialize(void *params, void **provider) {
130
149
ze_provider -> device = ze_params -> level_zero_device_handle ;
131
150
ze_provider -> memory_type = (ze_memory_type_t )ze_params -> memory_type ;
132
151
133
- ze_result_t ret = g_ze_ops .zeDeviceGetProperties (
134
- ze_provider -> device , & ze_provider -> device_properties );
135
- if (ret != ZE_RESULT_SUCCESS ) {
152
+ umf_result_t ret = ze2umf_result (g_ze_ops .zeDeviceGetProperties (
153
+ ze_provider -> device , & ze_provider -> device_properties ));
154
+
155
+ if (ret != UMF_RESULT_SUCCESS ) {
136
156
umf_ba_global_free (ze_provider );
137
- return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
157
+ return ret ;
138
158
}
139
159
140
160
* provider = ze_provider ;
@@ -211,22 +231,23 @@ static umf_result_t ze_memory_provider_alloc(void *provider, size_t size,
211
231
break ;
212
232
}
213
233
default :
214
- return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
234
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
235
+ }
236
+
237
+ if (ze_result != ZE_RESULT_SUCCESS ) {
238
+ return ze2umf_result (ze_result );
215
239
}
216
240
217
241
for (uint32_t i = 0 ; i < ze_provider -> resident_device_count ; i ++ ) {
218
242
ze_result = g_ze_ops .zeContextMakeMemoryResident (
219
243
ze_provider -> context , ze_provider -> resident_device_handles [i ],
220
244
* resultPtr , size );
221
245
if (ze_result != ZE_RESULT_SUCCESS ) {
222
- break ;
246
+ return ze2umf_result ( ze_result ) ;
223
247
}
224
248
}
225
249
226
- // TODO add error reporting
227
- return (ze_result == ZE_RESULT_SUCCESS )
228
- ? UMF_RESULT_SUCCESS
229
- : UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
250
+ return ze2umf_result (ze_result );
230
251
}
231
252
232
253
static umf_result_t ze_memory_provider_free (void * provider , void * ptr ,
@@ -236,11 +257,7 @@ static umf_result_t ze_memory_provider_free(void *provider, void *ptr,
236
257
assert (provider );
237
258
ze_memory_provider_t * ze_provider = (ze_memory_provider_t * )provider ;
238
259
ze_result_t ze_result = g_ze_ops .zeMemFree (ze_provider -> context , ptr );
239
-
240
- // TODO add error reporting
241
- return (ze_result == ZE_RESULT_SUCCESS )
242
- ? UMF_RESULT_SUCCESS
243
- : UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
260
+ return ze2umf_result (ze_result );
244
261
}
245
262
246
263
void ze_memory_provider_get_last_native_error (void * provider ,
@@ -249,9 +266,9 @@ void ze_memory_provider_get_last_native_error(void *provider,
249
266
(void )provider ;
250
267
(void )ppMessage ;
251
268
252
- // TODO
253
269
assert (pError );
254
- * pError = 0 ;
270
+
271
+ * pError = TLS_last_native_error ;
255
272
}
256
273
257
274
static umf_result_t ze_memory_provider_get_min_page_size (void * provider ,
@@ -356,7 +373,7 @@ static umf_result_t ze_memory_provider_get_ipc_handle(void *provider,
356
373
& ze_ipc_data -> ze_handle );
357
374
if (ze_result != ZE_RESULT_SUCCESS ) {
358
375
LOG_ERR ("zeMemGetIpcHandle() failed." );
359
- return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
376
+ return ze2umf_result ( ze_result ) ;
360
377
}
361
378
362
379
ze_ipc_data -> pid = utils_getpid ();
@@ -384,7 +401,7 @@ static umf_result_t ze_memory_provider_put_ipc_handle(void *provider,
384
401
ze_ipc_data -> ze_handle );
385
402
if (ze_result != ZE_RESULT_SUCCESS ) {
386
403
LOG_ERR ("zeMemPutIpcHandle() failed." );
387
- return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
404
+ return ze2umf_result ( ze_result ) ;
388
405
}
389
406
return UMF_RESULT_SUCCESS ;
390
407
}
@@ -421,7 +438,7 @@ static umf_result_t ze_memory_provider_open_ipc_handle(void *provider,
421
438
}
422
439
if (ze_result != ZE_RESULT_SUCCESS ) {
423
440
LOG_ERR ("zeMemOpenIpcHandle() failed." );
424
- return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
441
+ return ze2umf_result ( ze_result ) ;
425
442
}
426
443
427
444
return UMF_RESULT_SUCCESS ;
@@ -439,7 +456,7 @@ ze_memory_provider_close_ipc_handle(void *provider, void *ptr, size_t size) {
439
456
ze_result = g_ze_ops .zeMemCloseIpcHandle (ze_provider -> context , ptr );
440
457
if (ze_result != ZE_RESULT_SUCCESS ) {
441
458
LOG_ERR ("zeMemCloseIpcHandle() failed." );
442
- return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
459
+ return ze2umf_result ( ze_result ) ;
443
460
}
444
461
445
462
return UMF_RESULT_SUCCESS ;
0 commit comments